推荐使用C来写DLL,让创建的DLL能够被任何支持动态链接库的语言调用 你需要实现自己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 IntegerSub Test() Dim i As Integer i = vbShiftRight(4, 2) Debug.Assert i = 1 End Sub
/////////////////////////////////////////////////////////////////////
// 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 IntegerSub Test()
Dim i As Integer
i = vbShiftRight(4, 2)
Debug.Assert i = 1
End Sub