VBGood网站全文搜索 Google

搜索VBGood全站网页(全文搜索)

VB爱好者乐园(VBGood)

 找回密码
 立即注册
搜索
查看: 2110|回复: 0

[经验技巧] 分享一些VB写标准DLL的经验,与大家共同交流(大侠莫笑)

[复制链接]
发表于 2012-7-28 14:01:12 | 显示全部楼层 |阅读模式
本帖最后由 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

点评

嗯,的确加上共享节就可以共享了,貌似以前我看过类似的,其实就是在链接时加上一个共享属性的节名即可  发表于 2012-7-28 20:41
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

文字版|手机版|小黑屋|VBGood  

GMT+8, 2022-7-3 01:44

VB爱好者乐园(VBGood)
快速回复 返回顶部 返回列表