这样获得DLL的句柄是否正确

yusmt 2008-04-28 09:55:46
在C++中
HANDLE tHand;
extern "C" __declspec(dllexport)
BOOL APIENTRY DllMain( HANDLE hModule,DWORD ul_reason_for_call,LPVOID lpReserved)
{
tHand=hModule;
return TRUE;
}

HANDLE __stdcall initial ( )
{
return tHand;//这是否为返回DLL的句柄
}


在VB中 方法一
Private Declare Function initial Lib "mydll.dll" () As Long
Private Sub Command6_Click()
MsgBox initial '//调用C++的initial获得句柄.
End Sub

在VB中 方法二
Private Declare Function GetModuleHandle Lib "kernel32" Alias _
"GetModuleHandleA" (ByVal lpModuleName As String) As Long
Private Sub Command6_Click()
MsgBox GetModuleHandle(App.Path & "\mydll.dll") '\\使用系统API的GetModuleHandleA函数获得
End Sub
以上两种方法运行的结果返回值是相同的,BUBEG时返回值均为67043328,生成EXE后返回值为22085632

我不知这个返回值是否为DLL的句柄,新手,请多帮助,谢谢.
...全文
258 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
knowledge_Is_Life 2008-04-30
  • 打赏
  • 举报
回复
我也想知道,正在找這方面的資料~~~~~
blastzgd 2008-04-29
  • 打赏
  • 举报
回复
如果是在本进程内使用,这样获取的DLL实例句柄是有效的.
如果要在其它进程中操作此句柄,必须在目标进程内创建线程,并通过事件等方式来激活它的使用,DuplicateHandle不可用于模块句柄.
yusmt 2008-04-28
  • 打赏
  • 举报
回复
其实hModule是DLL的基地址//不明白什么是基地址

我还是没搞清楚"这样获得DLL的句柄(或者说实例句柄、==)是否正确",请问答案是?
1. 正确
2. 不正确
KeSummer 2008-04-28
  • 打赏
  • 举报
回复
BOOL APIENTRY DllMain( HANDLE hModule,DWORD ul_reason_for_call,LPVOID lpReserved)
{
tHand=hModule;
return TRUE;
}

其实hModule是DLL的基地址。。
yusmt 2008-04-28
  • 打赏
  • 举报
回复
那称为DLL的实例句柄应该没错吧,是不是说我的操作是正确的?获回的那个值就是这个DLL的实例句柄?
但有一点我不明白,为何有时我同时多次执行这个EXE的时候,返回的实例句柄HINSTANCE会相同呢.

比如我同时打开2次这个EXE之后执行的结果都为22609920,这是为何?按说实例句柄值应该是唯一的啊。
我在DLL中包含有一个变量static int a,我使用EXE调用时每次对其增一,虽然以上的实例句柄返回值相同,
但EXE调用这个变量a时,其显示的值还是正确的。
也就是说虽然两个DLL返回的tHand都为22609920,但其中的静态变量a所存储的数据还是各不相同的。

应该还是我对实例句柄概念还很模糊,还望各位朋友能指点迷津、在下不胜感激。
Eleven 2008-04-28
  • 打赏
  • 举报
回复
HMODULUE hModule=GetModuleHandle();
cofanz 2008-04-28
  • 打赏
  • 举报
回复
HMODULE更准确一些,叫HANDLE没错
ouyh12345 2008-04-28
  • 打赏
  • 举报
回复
不是HANDLE,而是HINSTANCE

15,466

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧