日开发个用到动态链接库在VB中时遇到了些问题我查了些资料也看了下CSDN上文章感觉这些文章对在VB中VC开发DLL这问题阐述得不够详细因此在我问题得到解决的余特为初接触DLL朋友们写下这篇文章 prefix = o ns = \"urn:schemas-microsoft-com:office:office\" />
本文中有关约定解决思路方法也适用于解决其它编程语言的间DLL兼容问题
①有关DLL创建和
使用VC向导即可具体操作如下:打开菜单“File\\New”→选择“Projects\\Win32 Dynamic-Link Library”→选择“A simple DLL project”即可这时系统会自动生成3个文件:*.cppstdafx.cppstdafx.h
的后将入口DLLMain补充完整再添加你自定义代码如果你自定义很多可以将这些声明部分统写入个头文件中再在.cpp文件首部用“#”语句引入这个头文件注意声明前要加上“__declspec(dllexport)”
(如果你建DLL时选择是第 3种类型(加入举例代码)则在声明及定义前都要加上系统定义宏“*_API”)
在VB中用如下语句声明:“Declare Function 名 Lib \"完整路径\\文件名.dll\" [Alias \"别名\"] (ByVal 变量1 As 类型1, ByVal 变量2 As 类型2,…) As 类型3”和API类似
注意:若在窗体代码“通用”部分使用“Declare”前要加“Private”;若在Moudle中使用“Declare”前要加“Public”若将DLL文件放在“\\Windows\\”或“\\WinNT\\32”目录下“Lib”后只写出DLL主文件名即可
具体例子代码见④(修正后可直接运行)
②有关入口点
如上编写Cipher.dll运行出现信息“找不到DLL入口点(Error 53)”出现这原因是C编译器在编译时对名Encrypt作了修改打开快速查看(D:\\WINNT\\32\\Viewers\\QuikView.exe),将Cipher.dll拖入查看窗口找到字段”,发现名被加了串
解决思路方法有 2第直接在VB声明中将“?Encrypt@@Y AHHH@Z”作为别名放在“Alias”后即可;第 2在Cipher.dll代码中在语句“__declspec(dllexport) __stdcall Encrypt( p, k); ”前加上“extern \"C\" ”编译后用QuikView查看名变为“_Encrypt”的后再在VB声明中做相应调整即可
(对于使用宏DLL在“#”语句中对宏“Cipher_API”替换值做更改即可)
进行了③更改后又找不到入口点了再用QuikView查看发现名变为”还有解决思路方法在Cipher.dll工程中添加个文本文件命名为“Cipher.def”,添加代码如④编译后再用QuikView查看名变回“Encrypt”在VB中运行正常
③有关约定
采用②中第 2种解决思路方法运行出现信息“DLL约定(Error 49)”原因是约定共有4种方式:__fastcall、__pascal、__stdcall、__cdeclVC默认方式为__cdecl而VB默认方式则为__stdcall解决思路方法是更改代码如下(限定方式):
extern “C” __declspec(dllexport) __stdcall Encrypt( p, k);
…………
__stdcall Encrypt( p, k)
{
c = p+k;
c;
}
④源代码
Cipher.dll:
Cipher.cpp:
//引入预编译头文件
# “stdafx.h”
//声明我
extern “C” __declspec(dllexport) __stdcall Encrypt( p, k );
//DLL入口
BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch( ul_reason_for_call )
{
DLL_PROCESS_ATTACH:
DLL_THREAD_ATTACH:
DLL_THREAD_DETACH:
DLL_PROCESS_DETACH:
;
}
TRUE;
}
//我
__stdcall Encrypt ( p, k )
{
c = p + k ;
c ;
}
Cipher.def:
LIBRARY Cipher
EXPORTS Encrypt
编译后将Cipher.dll复制到“D:\\WINNT\\32”目录
在VB中:
Option Explicit
Private Declare Function Encrypt Lib “Cipher” _
(ByVal p As Long, ByVal k As Long) As Long
Private Sub Form_Load
Dim c As Long
c = Encrypt(24, 8)
Text1.Text = c
End Sub
最新评论