delphi編寫dll心得, 謝謝原作者的分享。轉


delphi編寫dll心得
 
1。每個函數體(包括exports和非exports函數)后面加 'stdcall;', 以編寫出通用的dll
2。exports函數后面必須加'export;'(放在'stdcall;'前面)
3。對於非exports函數可以使用string類型,而且建議使用string類型進行參數傳遞
4。對於exports函數請使用PChar類型做參數傳遞
5。如果exports調用其他函數,建議在exports函數體內使用變量過渡,然后再調用其他函數;  也就是說:盡量不要把exports的參數再作為參數調用其他函數。
 
6。exports函數中如果有回傳參數:如果是非地址型的(如integer,boolean等基本類型)請  使用var前綴,如果是地址型的請不要使用var前綴(如PChar或數組等)。  對不使用var前綴要回傳的參數請使用內存拷貝類函數,如StrPCopy,CopyMemory,Move等。  原因:dll和主應用程序並不能很好的共用一塊內存,所以必須進行內存拷貝才能正確將dll  中的內容回傳(拷貝)到主應用程序中。也因此對回傳的地址標識類參數,在調用dll之前必須  進行內存分配,例如Delphi中:AllocMem(n integer),Pb中:Space(n long)。  注意在調用dll處dll函數聲明時,若是delphi參數聲明同dll中的參數聲明(回傳地址型的參數無需加  var),若是pb回傳參數必須加ref 前綴。
 
7。非exports函數的參數必須遵循規則:回傳參數加前綴var,你完全可以對待非exports函數同在Delphi應用  里寫函數一樣
8。非exports函數中如果有數組參數,無論是否回傳,請加var前綴,它是地址調用
9。在dll中布爾型請注意bool和boolean的區別,在調用方環境中將可能引起不同的結果
10。在dll函數中盡量避免使用delphi特有的數據類型或類,如TStringList等
11。減少use列表中不必要單元的引用,以減少dll的大小
 
12。dll的調試:可以使用showmessage(需use dialogs)來調試,也可以[run]->[Parameters]中配置宿主  程序來單步跟蹤dll的執行情況
13。請注意dll中申請的所有內存必須正確釋放,否則dll可能在被調用n次之后會出現地址引用錯誤
 
14。在調用dll時候:
     1)運行環境:可以直接放在應用程序同目錄下,也可以放在一個文件夾下,如果放在一個文件夾下  你必須將此文件夾路徑設置到環境變量中,你可以在應用程序中設置,也可以在dll中設置:
var
    PathBuf: array[0..2048] of Char;
    Pathstr: String;
begin
    FillChar(PathBuf,2048,' ');
    windows.GetEnvironmentVariable('PATH',PathBuf,2048);
    Pathstr:=String(PathBuf);
    Pathstr:=Trim(Pathstr);
    if Pos(lowerCase(AppPath+'tuxedo\dll'),LowerCase(Pathstr))<=0 then
    begin
        Pathstr:=Pathstr+ ';'+AppPath+'tuxedo\dll' ;
        SetEnvironmentVariable('PATH',PAnsiChar(Pathstr));
    end;
end;
 
   2)開發環境:若delphi同運行環境沒什么區別,它是直接編譯生成應用程序,並運行應用程序;      若PB,必須將dll的路徑相對PB的開發工具的應用程序來設置,如放到pb9.0.exe同目錄下,當然你可以設置[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\]下面對應你的開發工具的應用程序名稱目錄下設置dll所在的路徑(分號隔開添加既可,不要將原來的路徑覆蓋)
 
15。在dll中獲取dll的路徑:
var
    Buffer:array [0..255] of char;
    tmpstr:String;
begin
    GetModuleFileName(HInstance, Buffer, SizeOf(Buffer));
    tmpstr:=ExtractFilePath(Buffer);
    //...
end;
 
16。提示信息盡量不要在dll中showmessage,最好是作為信息參數傳回,宿主程序再根據結果來進行信息提示,  這樣也可以不引用Dialogs單元。
 

本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/gzhubin/archive/2008/07/01/2603190.aspx


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM