VBNET動態連接庫還是比較常用的於是我研究了一下在這裡拿出來和大家分享一下希望對大家有用Windows動態連接庫是包含數據和函數的模塊可以被其它可執行文件(EXEDLLOCX 等)調用動態連接庫包含兩種函數輸出(exported)函數和內部(internal)函數輸出函數可以被其它模塊調用而內部函數則只能在動態連接庫內部使用
盡管VBNET動態連接庫也能輸出 數據但實際上它的數據通常是只在內部使用的使用動態連接庫的優點是顯而易見的將應用程序的一部分功能提取出來做成動態連接庫不但減小了主應用程序的大小提高了程序 運行效率還使它更加易於升級多個應用程序共享一個動態連接庫還能有效地節省系統資源正因為如此在Windows系統中動態連接庫得到了大量的使用
一般來說動態連接庫都是以DLL為擴展名的文件如Kerneldllcommdlgdll等但也有例外如位Windows的核心部件之一GDIexe其實也是一個動態庫編寫動態連接庫的工具很多如VisualC++BorlandC++Delphi等具體方法可以參見相關文檔下面只以Visual C++為例介紹一下開發應用於VisualBasic的動態連接庫時應注意的問題(本文中所有涉及C/C++語言或編譯環境的地方都以VC為例所有涉及Visual Basic的地方都以VB 為例)
作為一種位Windows應用程序的開發工具VB生成的exe文件自然也都是位的通常情況下也只能調用位的動態連接庫但是並不是所有的位動態庫都能被VB生成的exe 文件正確地識別一般來說自己編寫用於VBNET動態連接庫時應注意以下幾個方面的
問題
生成動態庫時要使用__stdcall調用約定而不能使用缺省的__cdecl調用約定__stdcall 約定通常用於位API函數的調用
在VC中的定義文件(def)中必須列出輸出函數的函數名以強制VC系統將輸出函數的裝飾名(decoratedname)改成普通函數名所謂裝飾名是VC的編譯器在編譯過程中生成的輸出函數名它包含了用戶定義的函數名函數參數及函數所在的類等多方面的信息由於在VC中定義文件不是必需的因此工程不包含定義文件時VC就按自己的約定將用戶定義的輸出函數名修改成裝飾名後放到輸出函數列表中這樣的輸出函數在VB生成的應用程序中是不能正確調用的(除非聲明時使用Alias子句)因此需要增加一個def文件其中列出用戶需要的函數名以強制VC不按裝飾名進行輸出
VC中的編譯選項結構成員對齊方式(structure member alignment) 應設成字節其原因將在後文詳細介紹
由於在C中整型變量是個字節而VB中的整型變量依然只有個字節因此在C中聲 明的整型(int)變量在VB中調用時要聲明為長整型(long)而C中的短整型(short)在VB中則 要聲明成整型(integer)下表針對最常用的C語言數據類型列出了與之等價的Visual Basic 類型(用於位版本的Windows)
From:http://tw.wingwit.com/Article/program/ASP/201311/21696.html