|
本帖最后由 bxc1995 于 2012-7-28 14:02 编辑
最近在用VB写一些标准DLL遇到了一些问题,经过努力后基本得以解决.在此与大家分享一下:
最后还有我修改的VB写标准DLL插件.
VB DLL获取模块句柄问题:
使用VB开发标准DLL是困难重重啊,因为是DLL,所以VB一些自带的函数不能用.
比如App.xxx一使用就会出错的.
那么如何获取dll模块句柄呢?经过分析C++的dll源码之后发现在DLL被装载到进程空间时,模块句柄其实就已经传入了.
C++代码如下:
BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
{
return TRUE;
}
其中hModule就是句柄,想必也不用多说了.
ul_reason_for_call这个参数有的DLL中名字不一样,但功能是一样的,传入的是 加/卸 载DLL的信息,具体的参数可以百度DLLMain.
lpReserved是个指针,用不到.
还有要注意的,因为VB默认是不支持开发标准DLL的.所以不管用什么方法写DLL,都必须要有DLLMain函数.而且必须返回True,
否则DLL就会加载失败(如果DLLMain返回的是Long型的,那么返回非0值即可),而使用VB开发的EXE调用DLL时,也会提示找不到DLL的.
VB版的DLLMain标准函数如下:
Public ModuleHandle As Long '在模块中声明的保存DLL句柄的全局变量
Public Function DLLMain(ByVal hInstance As Long, ByVal fdwReason As Long, ByVal pvReserved As Long) As Boolean
If ModuleHandle = 0 Then
ModuleHandle = hInstance
End If
DLLMain = True
End Function
要注意的是传入的变量需为ByVal型(即传值)
VB DLL全局变量的问题:
VB写的DLL如果被多个程序装载后,其全局变量可以共享么?
如果不经过处理,是不行的.
其实处理很简单.把DLL的区段属性都加上在内存中可共享即可.
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|