導航:首頁 > 源碼編譯 > dll編譯器

dll編譯器

發布時間:2022-01-15 05:14:27

㈠ .dll文件是用什麼編寫的呀

DLL是一種特殊的可執行文件。說它特殊主要是因為一般它都不能直接運行,需要宿主程序比如*.EXE程序或其他DLL的動態調用才能夠使用。簡單的說,在通常情況下DLL是經過編譯的函數和過程的集合。
使用DLL技術主要有以下幾個原因:

一、減小可執行文件大小。
DLL技術的產生有很大一部分原因是為了減小可執行文件的大小。當操作系統進入Windows時代後,其大小已經達到幾十兆乃至幾百兆。試想如果還是使用DOS時代的單執行文件體系的話一個可執行文件的大小可能將達到數十兆,這是大家都不能接受的。解決的方法就是採用動態鏈接技術將一個大的可執行文件分割成許多小的可執行程序。

二、實現資源共享。
這里指的資源共享包括很多方面,最多的是內存共享、代碼共享等等。早期的程序員經常碰到這樣的事情,在不同的編程任務中編寫同樣的代碼。這種方法顯然浪費了很多時間,為了解決這個問題人們編寫了各種各樣的庫。但由於編程語言和環境的不同這些庫一般都不能通用,而且用戶在運行程序時還需要這些庫才行,極不方便。DLL的出現就像制定了一個標准一樣,使這些庫有了統一的規范。這樣一來,用不同編程語言的程序員可以方便的使用用別的編程語言編寫的DLL。另外,DLL還有一個突出的特點就是在內存中只裝載一次,這一點可以節省有限的內存,而且可以同時為多個進程服務。

三、便於維護和升級。
細心的朋友可能發現有一些DLL文件是有版本說明的。(查看DLL文件的屬性可以看到,但不是每一個DLL文件都有)這是為了便於維護和升級。舉個例子吧,早期的Win95中有一個BUG那就是在閏年不能正確顯示2月29日這一天。後來,Microsoft發布了一個補丁程序糾正了這個BUG。值得一提的是,我們並沒有重裝Win95,而是用新版本的DLL代替了舊版本的DLL。(具體是哪一個DLL文件筆者一時想不起來了。)另一個常見的例子是驅動程序的升級。例如,著名的DirectX就多次升級,現在已經發展到了6.0版了。更妙的是,當我們試圖安裝較低版本的DLL時,系統會給我們提示,避免人為的操作錯誤。例如我們升級某硬體的驅動程序時,經常碰到Windows提示我們當前安裝的驅動程序比原來的驅動程序舊。

四、比較安全。
這里說的安全也包括很多方面。比如,DLL文件遭受病毒的侵害機率要比普通的EXE文件低很多。另外,由於是動態鏈接的,這給一些從事破壞工作的「高手」們多少帶來了一些反匯編的困難。

第二章 在Delphi中編寫DLL top

注意:在這里筆者假定讀者使用的是Delphi 3或Delphi 4開場白說了那麼多,總該言歸正傳了。編寫DLL其實也不是一件十分困難的事,只是要注意一些事項就夠了。為便於說明,我們先舉一個例子。

library Delphi;

uses
SysUtils,
Classes;

function TestDll(i:integer):integer;stdcall;
begin
Result:=i;
end;

exports
TestDll;

begin
end.

上面的例子是不是很簡單?熟悉Delphi的朋友可以看出以上代碼和一般的Delphi程序的編寫基本是相同的,只是在TestDll函數後多了一個stdcall參數並且用exports語句聲明了TestDll函數。只要編譯上面的代碼,就可以得到一個名為Delphi.dll的動態鏈接庫。現在,讓我們來看看有哪些需要注意的地方。 一、在DLL中編寫的函數或過程都必須加上stdcall調用參數。在Delphi 1或Delphi 2環境下該調用參數是far。從Delphi 3以後將這個參數變為了stdcall,目的是為了使用標準的Win32參數傳遞技術來代替優化的register參數。忘記使用stdcall參數是常見的錯誤,這個錯誤不會影響DLL的編譯和生成,但當調用這個DLL時會發生很嚴重的錯誤,導致操作系統的死鎖。原因是register參數是Delphi的默認參數。

二、所寫的函數和過程應該用exports語句聲明為外部函數。
正如大家看到的,TestDll函數被聲明為一個外部函數。這樣做可以使該函數在外部就能看到,具體方法是單激滑鼠右鍵用「快速查看(Quick View)」功能查看該DLL文件。(如果沒有「快速查看」選項可以從Windows CD上安裝。)TestDll函數會出現在Export Table欄中。另一個很充分的理由是,如果不這樣聲明,我們編寫的函數將不能被調用,這是大家都不願看到的。

三、當使用了長字元串類型的參數、變數時要引用ShareMem。
Delphi中的string類型很強大,我們知道普通的字元串長度最大為256個字元,但Delphi中string類型在默認情況下長度可以達到2G。(對,您沒有看錯,確實是兩兆。)這時,如果您堅持要使用string類型的參數、變數甚至是記錄信息時,就要引用ShareMem單元,而且必須是第一個引用的。既在uses語句後是第一個引用的單元。如下例:
uses
ShareMem,
SysUtils,
Classes;
還有一點,在您的工程文件(*.dpr)中而不是單元文件(*.pas)中也要做同樣的工作,這一點Delphi自帶的幫助文件沒有說清楚,造成了很多誤會。不這樣做的話,您很有可能付出死機的代價。避免使用string類型的方法是將string類型的參數、變數等聲明為Pchar或ShortString(如:s:string[10])類型。同樣的問題會出現在當您使用了動態數組時,解決的方法同上所述。

第三章 在Delphi中靜態調用DLL top

調用一個DLL比寫一個DLL要容易一些。首先給大家介紹的是靜態調用方法,稍後將介紹動態調用方法,並就兩種方法做一個比較。同樣的,我們先舉一個靜態調用的例子。

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics,
Controls, Forms, Dialogs, StdCtrls;

type
TForm1 = class(TForm)
Edit1: TEdit;
Button1: TButton;
procere Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.DFM}

//本行以下代碼為我們真正動手寫的代碼

function TestDll(i:integer):integer;stdcall;
external 』Delphi.dll』;

procere TForm1.Button1Click(Sender: TObject);
begin
Edit1.Text:=IntToStr(TestDll(1));
end;

end.

上面的例子中我們在窗體上放置了一個編輯框(Edit)和一個按鈕(Button),並且書寫了很少的代碼來測試我們剛剛編寫的Delphi.dll。大家可以看到我們唯一做的工作是將TestDll函數的說明部分放在了implementation中,並且用external語句指定了Delphi.dll的位置。(本例中調用程序和Delphi.dll在同一個目錄中。)讓人興奮的是,我們自己編寫的TestDll函數很快被Delphi認出來了。您可做這樣一個實驗:輸入「TestDll(」,很快Delphi就會用fly-by提示條提示您應該輸入的參數是什麼,就像我們使用Delphi中定義的其他函數一樣簡單。注意事項有以
下一些:

一、調用參數用stdcall。
和前面提到的一樣,當引用DLL中的函數和過程時也要使用stdcall參數,原因和前面提到的一樣。

二、用external語句指定被調用的DLL文件的路徑和名稱。
正如大家看到的,我們在external語句中指定了所要調用的DLL文件的名稱。沒有寫路徑是因為該DLL文件和調用它的主程序在同一目錄下。如果該DLL文件在C:\,則我們可將上面的引用語句寫為external 』C:\Delphi.dll』。注意文件的後綴.dll必須寫上。

三、不能從DLL中調用全局變數。
如果我們在DLL中聲明了某種全局變數,如:var s:byte 。這樣在DLL中s這個全局變數是可以正常使用的,但s不能被調用程序使用,既s不能作為全局變數傳遞給調用程序。不過在調用程序中聲明的變數可以作為參數傳遞給DLL。

四、被調用的DLL必須存在。
這一點很重要,使用靜態調用方法時要求所調用的DLL文件以及要調用的函數或過程等等必須存在。如果不存在或指定的路徑和文件名不正確的話,運行主程序時系統會提示「啟動程序時出錯」或「找不到*.dll文件」等運行錯誤。

第四章 在Delphi中動態調用DLL top

動態調用DLL相對復雜很多,但非常靈活。為了全面的說明該問題,這次我們舉一個調用由C++編寫的DLL的例子。首先在C++中編譯下面的DLL源程序。

#include

extern 」C」 _declspec(dllexport)
int WINAPI TestC(int i)
{
return i;
}

編譯後生成一個DLL文件,在這里我們稱該文件為Cpp.dll,該DLL中只有一個返回整數類型的函數TestC。為了方便說明,我們仍然引用上面的調用程序,只是將原來的Button1Click過程中的語句用下面的代碼替換掉了。

procere TForm1.Button1Click(Sender: TObject);
type
TIntFunc=function(i:integer):integer;stdcall;
var
Th:Thandle;
Tf:TIntFunc;
Tp:TFarProc;
begin
Th:=LoadLibrary(』Cpp.dll』); {裝載DLL}
if Th>0 then
try
Tp:=GetProcAddress(Th,PChar(』TestC』));
if Tp<>nil
then begin
Tf:=TIntFunc(Tp);
Edit1.Text:=IntToStr(Tf(1)); {調用TestC函數}
end
else
ShowMessage(』TestC函數沒有找到』);
finally
FreeLibrary(Th); {釋放DLL}
end
else
ShowMessage(』Cpp.dll沒有找到』);
end;

大家已經看到了,這種動態調用技術很復雜,但只要修改參數,如修改LoadLibrary(』Cpp.dll』)中的DLL名稱為』Delphi.dll』就可動態更改所調用的DLL。

一、定義所要調用的函數或過程的類型。
在上面的代碼中我們定義了一個TIntFunc類型,這是對應我們將要調用的函數TestC的。在其他調用情況下也要做同樣的定義工作。並且也要加上stdcall調用參數。

二、釋放所調用的DLL。
我們用LoadLibrary動態的調用了一個DLL,但要記住必須在使用完後手動地用FreeLibrary將該DLL釋放掉,否則該DLL將一直佔用內存直到您退出Windows或關機為止。

現在我們來評價一下兩種調用DLL的方法的優缺點。靜態方法實現簡單,易於掌握並且一般來說稍微快一點,也更加安全可靠一些;但是靜態方法不能靈活地在運行時裝卸所需的DLL,而是在主程序開始運行時就裝載指定的DLL直到程序結束時才釋放該DLL,另外只有基於編譯器和鏈接器的系統(如Delphi)才可以使用該方法。動態方法較好地解決了靜態方法中存在的不足,可以方便地訪問DLL中的函數和過程,甚至一些老版本DLL中新添加的函數或過程;但動態方法難以完全掌握,使用時因為不同的函數或過程要定義很多很復雜的類型和調用方法。對於初學者,筆者建議您使用靜態方法,待熟練後再使用動態調用方法。

第五章 使用DLL的實用技巧 top

一、編寫技巧。
1 、為了保證DLL的正確性,可先編寫成普通的應用程序的一部分,調試無誤後再從主程序中分離出來,編譯成DLL。

2 、為了保證DLL的通用性,應該在自己編寫的DLL中杜絕出現可視化控制項的名稱,如:Edit1.Text中的Edit1名稱;或者自定義非Windows定義的類型,如某種記錄。

3 、為便於調試,每個函數和過程應該盡可能短小精悍,並配合具體詳細的注釋。

4 、應多利用try-finally來處理可能出現的錯誤和異常,注意這時要引用SysUtils單元。

5 、盡可能少引用單元以減小DLL的大小,特別是不要引用可視化單元,如Dialogs單元。例如一般情況下,我們可以不引用Classes單元,這樣可使編譯後的DLL減小大約16Kb。

二、調用技巧。
1 、在用靜態方法時,可以給被調用的函數或過程更名。在前面提到的C++編寫的DLL例子中,如果去掉extern 」C」語句,C++會編譯出一些奇怪的函數名,原來的TestC函數會被命名為@TestC$s等等可笑的怪名字,這是由於C++採用了C++ name mangling技術。這個函數名在Delphi中是非法的,我們可以這樣解決這個問題:
改寫引用函數為
function TestC(i:integer):integer;stdcall;
external 』Cpp.dll』;name 』@TestC$s』;
其中name的作用就是重命名。

2 、可把我們編寫的DLL放到Windows目錄下或者Windows\system目錄下。這樣做可以在external語句中或LoadLibrary語句中不寫路徑而只寫DLL的名稱。但這樣做有些不妥,這兩個目錄下有大量重要的系統DLL,如果您編的DLL與它們重名的話其後果簡直不堪設想,況且您的編程技術還不至於達到將自己編寫的DLL放到系統目錄中的地步吧!

三、調試技巧。
1 、我們知道DLL在編寫時是不能運行和單步調試的。有一個辦法可以,那就是在Run|parameters菜單中設置一個宿主程序。在Local頁的Host Application欄中添上宿主程序的名字就可進行單步調試、斷點觀察和運行了。

2 、添加DLL的版本信息。開場白中提到了版本信息對於DLL是很重要的,如果包含了版本信息,DLL的大小會增加2Kb。增加這么一點空間是值得的。很不幸我們如果直接使用Project|options菜單中Version選項是不行的,這一點Delphi的幫助文件中沒有提到,經筆者研究發現,只要加一行代碼就可以了。如下例:

library Delphi;

uses
SysUtils,
Classes;

{$R *.RES}
//注意,上面這行代碼必須加在這個位置

function TestDll(i:integer):integer;stdcall;
begin
Result:=i;
end;

exports
TestDll;

begin
end.

3 、為了避免與別的DLL重名,在給自己編寫的DLL起名字的時候最好採用字元數字和下劃線混合的方式。如:jl_try16.dll。

4 、如果您原來在Delphi 1或Delphi 2中已經編譯了某些DLL的話,您原來編譯的DLL是16位的。只要將源代碼在新的Delphi 3或Delphi 4環境下重新編譯,就可以得到32位的DLL了。

[後記]:除了上面介紹的DLL最常用的使用方法外,DLL還可以用於做資源的載體。例如,在Windows中更改圖標就是使用的DLL中的資源。另外,熟練掌握了DLL的設計技術,對使用更為高級的OLE、COM以及ActiveX編程都有很多益處。

㈡ .dll文件用什麼編輯器進行查看和編輯

你試下exescope這個軟體吧,能打開exe dll等文件類型。http://www.skycn.com/soft/2127.html

㈢ win7 64位 開機出現無法載入JIT編譯器,(mscorjit.dll)高分求解……謝謝,解決再高分酬謝!!!

親,這個問題你可以先試下重裝.NET Framework 試試,如果重裝不了,直接到別的電腦上拷貝一個.mscorjit.dll 到C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727 文件夾下面就好了!這個是.NET Framework 2.0 出現 的問題,今天剛好碰到,已解決!!

㈣ DLL是什麼工具寫,已經一些編寫問題。

你好:

很高興能幫到您,是一些開發軟體寫出來的。
這個DLL其實是一個動態鏈接庫文件,是一些多個程序同時使用的代碼
,如果您想要打開,只有運行一些文件就可以了(Windows的程序在Windows環境下操作
)。
如果你的電腦提示丟失的話:

去網上下載這個DLL文件,將其放置到system32目錄下面

重啟系統,或者在CMD下面運行regsvr32 *.dll注冊該DLL

同時我還推薦用管家修復缺失DLL文件的,騰訊電腦管家的電腦診所有這個功能喲!

如果您對我的答案不滿意,可以繼續追問或者提出寶貴意見,謝謝

㈤ 我想用C++寫一些DLL類庫文件用什麼編譯器好

我這里有我寫的一些C\C++編寫的DLL庫,和調用方法的簡單例子。。。。
郵箱:[email protected]

㈥ 如果用c語言編寫dll文件,一般用哪些編譯器,或者說工具軟體來實現

dll是windows獨有的,所以非vc++6.0莫屬。
新建一個project:win32 dynamic link library

㈦ DLL編輯器和DLL反編譯工具有什麼區別

DLL編輯器和DLL反編譯工具功能不同,兩者區別是:dll編輯器是編輯DLL文件用的,可以是任何一種語言編輯器都行,而DLL反編輯工具是把DLL文件翻譯成匯編語言的。

㈧ 如何查看一個dll是用什麼編譯器編譯的

dll文件是系統的動態鏈接庫文件,可以用一些十六位春文本編輯器打開,如UltraEdit
修改DLL文件的方法
1、下載DLL文件修改工具EXESCOPE6.0-6.3或6.4工具
2、獲取Browselc.dll、Shdoclc.dll、Shell32.dll和Cryptui.dll這幾個鏈接文件。在找這幾個文件時,最好將其他機器的硬碟,掛接在本機中,然後用本機的操作系統啟動並復制這幾個文件。
3、在修改DLL文件的時候,打開該鍵值,在右面的對話框中將所要修改的鍵值禁用即可,不要刪除,以備日後恢復

㈨ 在C#生成.dll 文件是什麼編譯器都是用什麼編譯器 生成安裝包等

這問題問的、、、
C#沒有那麼復雜、開發環境是VisualStudio
VisualStudio
是一個集成的開發環境、操作起來很簡單。
http://www.cnblogs.com/falla/archive/2010/01/29/1659393.html
博客園介紹將.cs(C#代碼類)文件單獨編譯成.dll文件

㈩ dll文件用什麼軟體來編輯

dll文件是系統的動態鏈接庫文件,可以用一些十六位春文本編輯器打開,如UltraEdit
一、DLL文件常識
DLL是Dynamic Link Library的縮寫,意為動態鏈接庫。在Windows中,許多應用程序並不是一個完整的可執行文件,它們被分割成一些相對獨立的動態鏈接庫,即DLL文件,放置於系統中。當我們執行某一個程序時,相應的DLL文件就會被調用。一個應用程序可有多個DLL文件,一個DLL文件也可能被幾個應用程序所共用,這樣的DLL文件被稱為共享DLL文件。DLL文件一般被存放在C:WindowsSystem目錄下
二、修改DLL文件的具體應用
在系統的組策略和注冊表中,我們可以修改一些鍵值來優化我們的系統,並加強操作系統的安全性。可是,對於限制下載、禁止刪除文件等功能,我們無法通過上述的操作來完成,這只有通過修改系統DLL文件來實現。目前,我們通過修改系統的DLL文件,可以實現禁止刪除文件、禁止IE下載、禁止IE另存為、禁止文件打開方式等功能。
三、系統中部分DLL文件的功能
1、Browselc.dll IE所需要調用的庫文件DLL結構雛形就是它了
2、Shdoclc.dll 系統窗口及設置等,如刪除文件、重命名
3、Shell32.dll 系統窗口及設置等,如刪除文件、重命名
4、Cryptui.dll IE控制項下載及提示對話框程序
四、修改DLL文件的方法
1、下載DLL文件修改工具EXESCOPE6.0-6.3或6.4工具
2、獲取Browselc.dll、Shdoclc.dll、Shell32.dll和Cryptui.dll這幾個鏈接文件。在找這幾個文件時,最好將其他機器的硬碟,掛接在本機中,然後用本機的操作系統啟動並復制這幾個文件。
3、在修改DLL文件的時候,打開該鍵值,在右面的對話框中將所要修改的鍵值禁用即可,不要刪除,以備日後恢復
五、DLL文件修改秘籍
1、禁止下載的修改方法:打開Shdoclc.dll修改資源--對話框---4416,將4416鍵值禁用即可。
2、禁止網頁添加到收藏夾,打開Shdoclc.dll修改資源--對話框---21400,將該鍵值禁用即可。
3、禁止惡意網頁載入控制項,修改Cryptui.dll文件,要同時修改5個地方才能完全禁止 資源--對話框---130 資源--對話框---230 資源--對話框---4101 資源--對話框---4104 資源--對話框---4107 將以各對話框中的相應鍵值,修改成為禁用就可以了。
4、禁止系統刪除文件修改Shell32.dll,這個文件需要修改5個地方才可以禁止系統刪除文件。資源--對話框---1011 資源--對話框---1012 資源--對話框---1013 資源--對話框---1021 資源--對話框---1022 將以上五個地址的鍵值禁用就可以了!
5、禁止文件被改名,修改shell32.dll,有2個地方需要修改資源--對話框---1018 資源--對話框---1019 將以上兩處的相應鍵值,修改為禁用就可以了!
6、禁止運行菜單,修改shell32.dll,將資源--對話框---1018鍵值設置為禁用。
7、禁止系統文件被挪動修改shell32.dll,需要修改4個地方 資源--對話框---1014 資源--對話框---1015 資源--對話框---1016 資源--對話框
8、禁止目標另存為,修改Shdoclc.dll文件,需要修改3個地方 資源--菜單--258---257 資源--菜單--258---252 資源--菜單--24641--2268 在這個修改中,我們要把各對應的鍵值刪除。打開該鍵值後,右鍵菜單中有刪除。在資源--菜單--24641—2268中,有多項該鍵值,請逐一刪除。
9、禁止自定義文件夾選項修改Shell32.dll文件,需要修改以下4個地方 資源--菜單--215---28719 資源--菜單--216---28719 資源--菜單--217---28719 資源--菜單--216---28719 找到以上四處鍵值,直接需要刪除後即可,而不是禁用。
10、禁止IE文件夾選項,修改Browselc.dll文件,需要修改3個鍵值 資源--菜單--263 (這里有多個請刪除)---41251(刪除) 資源--菜單--266(也有多個請刪除)---41329 (刪除) 資源--菜單--268---41251 (刪除) 在上面的3個鍵值中,個別鍵值有多處,請逐一刪除。
11、禁止98文件共享控制項,修改Msshrui.dll,需要修改2個地方 資源---對話框---- 1 --- AutoRadioButton 資源---對話框---- 30 --- AutoRadioButton 將以上兩處的鍵值禁用即可。其他的選項,可以根據自己的需要進行修改。找到相應的功能鍵值,將不需要的功能,禁用就可以了。
12、禁止文件的打開方式,修改Url.dll,需要修改2個地方 資源---對話框--- 7000 資源---對話框--- 7005 將以上兩處的鍵值禁用即可。
13、禁止更改系統桌面,修改Shdoc401.dll,有2處地方需要修改 資源---對話框--- 29952--- PushButton:瀏覽資源---對話框--- 29952--- PushButton:圖案 將以上兩處的鍵值禁用即可。
14、禁止系統文件夾自定義,修改Shd401lc.dll,有2處地方需要修改 資源---對話框--- 29957 資源---對話框--- 29958 將以上兩處的鍵值禁用即可。
15、禁止文件保存路徑及打開,修改Comdlg32.dll,有2處地方需要修改 資源---對話框--- 1547 資源---對話框--- 1548 將以上兩處的鍵值禁用即可。

閱讀全文

與dll編譯器相關的資料

熱點內容
視頻監控取消默認加密 瀏覽:294
雲伺服器怎麼設置輸入鍵盤 瀏覽:817
單片機支持多大mhz 瀏覽:42
linux啟動mysql命令 瀏覽:792
編程和游戲買什麼筆記本 瀏覽:902
程序員座點陣圖片大全 瀏覽:142
aix重啟命令 瀏覽:460
騰訊雲伺服器的後台 瀏覽:47
安卓怎麼定時打開軟體 瀏覽:597
笨手機應用加密怎麼刪除 瀏覽:97
為什麼vc6編譯是灰色 瀏覽:389
python音標讀法 瀏覽:577
反轉語句python 瀏覽:23
哪個app搞英雄聯盟手游活動 瀏覽:585
如何查看郵箱收發伺服器 瀏覽:521
極簡歐洲史中文版pdf 瀏覽:908
python顯示變數值 瀏覽:387
副路由器為什麼要關伺服器 瀏覽:575
國家反詐騙app蘋果怎麼設置 瀏覽:464
我的世界如何用指令造伺服器方熊 瀏覽:304