最近有許多人問如何讓動態鏈接庫的輸出函數能夠被任何支持動態鏈接庫的語言調用。寫動態鏈接庫是很EASY的事情。但是,他們大多覺得輸出的名字有亂字符(如:_vbShiftRight@1)。我想在這裡就討論一下如何讓輸出函數的名字中不出現亂子符。
首先,除非你絕對需要使用C++編碼,否則我還是推薦使用C來寫DLL。這裡我想讓創建的DLL可以在VB中使用。
你需要實現自己DLL的入口點函數和保證代碼使用stdcall調用規范,但這要依賴你使用的編譯器。例如,你可以在VC中使用“/entry:"DLLEntry"”命令行編譯選項來創建自己的入口點。“DLLEntry” 可以參考下列代碼:
/////////////////////////////////////////////////////////////////////
// DLL initialization and clean-up.
BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
{
switch(fdwReason) {
case DLL_PROCESS_ATTACH:
// Perform any DLL initialization here
break;
case DLL_PROCESS_DETACH:
// Perform any DLL cleanup here
break;
}
return TRUE;
}
為了保證你使用正確的調用規范,要通知編譯器使用stdcall規范和/或使用在windows.h(及相關文件)中定義的常量,如WINAPI等。通常DLL的代碼如下:
/////////////////////////////////////////////////////////////////////
// Shifts bits right for integers.
WORD WINAPI vbShiftRight(WORD nValue, WORD nBits)
{
return (nValue >> nBits);
}
下一步是與你在微軟文檔中讀到的內容相反。你需要創建一個DEF文件。這是你防止輸出函數名不出現亂字符的唯一方式(如_vbShiftRight@1)。DEF文件的形式如下:
EXPORTS
vbShiftRight
下一步是在VB中調用這個函數,使用以下聲明:
Declare Function vbShiftRight Lib "MYDLL.DLL" (ByVal nValue As Integer,
ByVal nBits As Integer)
As Integer
Sub Test()
Dim i As Integer
i = vbShiftRight(4, 2)
Debug.Assert i = 1
End Sub
如果你還想要更容易的方法從VB中調用,可以創建一個類型庫。為此你需要創建和編譯ODL(對象描述語言)文件。這個文件應該包含如下內容:
module MyModule {
[
helpstring("Shifts the bits of an integer to the right."),
entry("vbShiftRight")
]
short _stdcall vbShiftRight([in] short nValue, [in] short nBits);
};
當VB加載DLL的類型庫時,函數名和參數將出現在VB的對象浏覽器中。此外,如果用戶不輸入正確的參數類型,VB將產生一個錯誤。