欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
開(kāi)使你的第一個(gè)DLL
一、開(kāi)使你的第一個(gè)DLL專(zhuān)案
1.File->Close all->File->NewDLL

代碼:

//自動(dòng)產(chǎn)生Code如下
library Project2;

//
這有段廢話(huà)。
uses
  SysUtils,
  Classes;

{$R *.RES}

begin
end.



2.加個(gè)Func進(jìn)來(lái):

代碼:

library Project2;
uses
  SysUtils,
  Classes; 

    
    Function MyMax ( X , Y : integer ) : integer ; stdcall ;
        begin
        if X > Y then
            Result := X
        else
            Result := Y ;
        end ;
    //
切記:Library 的名字大小寫(xiě)沒(méi)關(guān)系,可是DLL-Func的大小寫(xiě)就有關(guān)系了。
    //   
DLL-Func-Name寫(xiě)成MyMaxmyMAX是不同的。如果寫(xiě)錯了,立即
    //   
的結果是你叫用到此DLLAP根本開(kāi)不起來(lái)。
    //
參數的大小寫(xiě)就沒(méi)關(guān)系了。甚至不必同名。如原型中是 (X,Y:integer)但引
    //    用時(shí)寫(xiě)成(A,B:integer),那是沒(méi)關(guān)系的。
    //切記:要再加個(gè)stdcall。書(shū)上講,如果你是用Delphi寫(xiě)DLL,且希望不僅給
    //     Delphi-AP也希望BCB/VC-AP等使用的話(huà),那你最好加個(gè)Stdcall ; 的指示
    //參數型態(tài):Delphi有很多種它自己的變量型態(tài),這些當然不是DLL所喜歡的
    //    ,Windows/DLL的母語(yǔ)應該是C。所以如果要傳進(jìn)傳出DLL的參數,我們
    //   
盡可能照規矩來(lái)用。這兩者寫(xiě)起來(lái),后者會(huì )麻煩不少。如果你對C不熟
    //   
的話(huà),那也沒(méi)關(guān)系。我們以后再講。
{$R *.RES}

begin
end.



3.將這些可共享的Func送出DLL,讓外界﹝就是你的Delphi-AP啦﹞使用:光如
此,你的AP還不能用到這些,你還要加個(gè)Exports才行。

代碼:

{$R *.RES}
exports
    MyMax ;
begin
end.



4.好了,可以按 Ctrl-F9編譯了。此時(shí)可不要按F9。DLL不是EXE不可單獨執行的,如果你按F9,會(huì )有ErrorMsg的。這時(shí)如果DLLError,請修正之。再按Ctrl-F9。此時(shí)可能有Warning,不要緊,研究一下,看看就好。再按Ctrl-F9,此時(shí)就『Done , Compiled 』。同目錄就會(huì )有個(gè) *.dll 。恭喜,大功告成了。

二、進(jìn)行測試:開(kāi)個(gè)新application
1.加個(gè)TButton

代碼:

ShowMessage ( IntToStr(MyMax(30,50)) ) ;


2.告知Exe到那里抓個(gè)Func

代碼:

//Form,interface,var后加
Function MyMax ( X , Y : integer ) : integer ; stdcall ; external ‘MyTestDLL.dll‘ ;
// MyTestDLL.dll
為你前時(shí)寫(xiě)的DLL項目名字
// DLL
名字大小寫(xiě)沒(méi)關(guān)系。不過(guò)記得要加 extension .DLL。在Win95NT,
//     
是不必加 extension,但這兩種OS,可能越來(lái)越少了吧。要加extension歐。



可以了,簡(jiǎn)單吧。


上面的例子是不是很簡(jiǎn)單?熟悉Delphi的朋友可以看出以上代碼和一般的Delphi程序的編寫(xiě)基本是相同的,只是在TestDll函數后多了一個(gè)stdcall參數并且用exports語(yǔ)句聲明了TestDll函數。只要編譯上面的代碼,就可以得到一個(gè)名為Delphi.dll的動(dòng)態(tài)鏈接庫?,F在,讓我們來(lái)看看有哪些需要注意的地方。 一、在DLL中編寫(xiě)的函數或過(guò)程都必須加上stdcall調用參數。在Delphi 1或Delphi 2環(huán)境下該調用參數是far。從Delphi 3以后將這個(gè)參數變?yōu)榱藄tdcall,目的是為了使用標準的Win32參數傳遞技術(shù)來(lái)代替優(yōu)化的register參數。忘記使用stdcall參數是常見(jiàn)的錯誤,這個(gè)錯誤不會(huì )影響DLL的編譯和生成,但當調用這個(gè)DLL時(shí)會(huì )發(fā)生很?chē)乐氐腻e誤,導致操作系統的死鎖。原因是register參數是Delphi的默認參數。

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

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

第三章 在Delphi中靜態(tài)調用DLL top

  調用一個(gè)DLL比寫(xiě)一個(gè)DLL要容易一些。首先給大家介紹的是靜態(tài)調用方法,稍后將介紹動(dòng)態(tài)調用方法,并就兩種方法做一個(gè)比較。同樣的,我們先舉一個(gè)靜態(tài)調用的例子。

unit Unit1;

interface

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

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

var
Form1: TForm1;

implementation

{$R *.DFM}

//本行以下代碼為我們真正動(dòng)手寫(xiě)的代碼

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

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

end.

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

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

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

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

四、被調用的DLL必須存在。
  這一點(diǎn)很重要,使用靜態(tài)調用方法時(shí)要求所調用的DLL文件以及要調用的函數或過(guò)程等等必須存在。如果不存在或指定的路徑和文件名不正確的話(huà),運行主程序時(shí)系統會(huì )提示“啟動(dòng)程序時(shí)出錯”或“找不到*.dll文件”等運行錯誤。

                  第四章 在Delphi中動(dòng)態(tài)調用DLL top

  動(dòng)態(tài)調用DLL相對復雜很多,但非常靈活。為了全面的說(shuō)明該問(wèn)題,這次我們舉一個(gè)調用由C++編寫(xiě)的DLL的例子。首先在C++中編譯下面的DLL源程序。

#include

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

  編譯后生成一個(gè)DLL文件,在這里我們稱(chēng)該文件為Cpp.dll,該DLL中只有一個(gè)返回整數類(lèi)型的函數TestC。為了方便說(shuō)明,我們仍然引用上面的調用程序,只是將原來(lái)的Button1Click過(guò)程中的語(yǔ)句用下面的代碼替換掉了。

procedure 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函數沒(méi)有找到’);
finally
FreeLibrary(Th); {釋放DLL}
end
else
ShowMessage(’Cpp.dll沒(méi)有找到’);
end;

  大家已經(jīng)看到了,這種動(dòng)態(tài)調用技術(shù)很復雜,但只要修改參數,如修改LoadLibrary(’Cpp.dll’)中的DLL名稱(chēng)為’Delphi.dll’就可動(dòng)態(tài)更改所調用的DLL。

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

二、釋放所調用的DLL。
  我們用LoadLibrary動(dòng)態(tài)的調用了一個(gè)DLL,但要記住必須在使用完后手動(dòng)地用FreeLibrary將該DLL釋放掉,否則該DLL將一直占用內存直到您退出Windows或關(guān)機為止。

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

                    第五章 使用DLL的實(shí)用技巧 top

一、編寫(xiě)技巧。
  1 、為了保證DLL的正確性,可先編寫(xiě)成普通的應用程序的一部分,調試無(wú)誤后再從主程序中分離出來(lái),編譯成DLL。

  2 、為了保證DLL的通用性,應該在自己編寫(xiě)的DLL中杜絕出現可視化控件的名稱(chēng),如:Edit1.Text中的Edit1名稱(chēng);或者自定義非Windows定義的類(lèi)型,如某種記錄。

  3 、為便于調試,每個(gè)函數和過(guò)程應該盡可能短小精悍,并配合具體詳細的注釋。

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

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

二、調用技巧。
  1 、在用靜態(tài)方法時(shí),可以給被調用的函數或過(guò)程更名。在前面提到的C++編寫(xiě)的DLL例子中,如果去掉extern ”C”語(yǔ)句,C++會(huì )編譯出一些奇怪的函數名,原來(lái)的TestC函數會(huì )被命名為@TestC$s等等可笑的怪名字,這是由于C++采用了C++ name mangling技術(shù)。這個(gè)函數名在Delphi中是非法的,我們可以這樣解決這個(gè)問(wèn)題:
改寫(xiě)引用函數為
function TestC(i:integer):integer;stdcall;
external ’Cpp.dll’;name ’@TestC$s’;
其中name的作用就是重命名。

  2 、可把我們編寫(xiě)的DLL放到Windows目錄下或者Windows\system目錄下。這樣做可以在external語(yǔ)句中或LoadLibrary語(yǔ)句中不寫(xiě)路徑而只寫(xiě)DLL的名稱(chēng)。但這樣做有些不妥,這兩個(gè)目錄下有大量重要的系統DLL,如果您編的DLL與它們重名的話(huà)其后果簡(jiǎn)直不堪設想,況且您的編程技術(shù)還不至于達到將自己編寫(xiě)的DLL放到系統目錄中的地步吧!

三、調試技巧。
  1 、我們知道DLL在編寫(xiě)時(shí)是不能運行和單步調試的。有一個(gè)辦法可以,那就是在Run|parameters菜單中設置一個(gè)宿主程序。在Local頁(yè)的Host Application欄中添上宿主程序的名字就可進(jìn)行單步調試、斷點(diǎn)觀(guān)察和運行了。

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

library Delphi;

uses
SysUtils,
Classes;

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

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

exports
TestDll;

begin
end.

  3 、為了避免與別的DLL重名,在給自己編寫(xiě)的DLL起名字的時(shí)候最好采用字符數字和下劃線(xiàn)混合的方式。如:jl_try16.dll。

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

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


 
 
本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
Delphi 編寫(xiě)DLL動(dòng)態(tài)鏈接庫文件的知識
delphi dll 調用技巧
Delphi 中控制 Word,xml,dll 等操作
Delphi中DLL的創(chuàng )建和使用
Delphi制作DLL
C#調用DLL錯誤:PInvokeStackImbalance。
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久