在DLL中用DialogBox函数产生一个对话框,为什么产生的却是调用者(exe)中的资源的对话框,而不是DLL资源中的对话框。如何让它产生dll资

sun4216 2007-09-17 05:00:31
如题
...全文
161 8 打赏 收藏 举报
写回复
8 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
Chivalry 2007-09-18
假设你生成的DLL名字叫做MyDll.dll
HANDLE hDLL = (HANDLE)GetModuleHandle("MyDll");
  • 打赏
  • 举报
回复
sun4216 2007-09-18
我的DLL没有DLLMAIN函数,但我用GetModuleHandle(NULL)获得DLL hInstance。结果还是不行。
  • 打赏
  • 举报
回复
flyelf 2007-09-18
you must use the Instance Handle which from the DllMain function
  • 打赏
  • 举报
回复
lyg_zy 2007-09-18
你用DialogBox或DialogBoxParam显示对话框吧。
那他们的第一个参数就是HINSTANCE hInstance呀。这里的hInstance要传你的dll的hInstance.

大概的示例代码:

HINSTANCE g_hModule
DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
{
// Remove this if you use lpReserved
UNREFERENCED_PARAMETER(lpReserved);

if (dwReason == DLL_PROCESS_ATTACH)
{
g_hModule = hInstance;
}


DialogBox( g_hModule ,....);
DialogBoxParam ( g_hModule ,....);


  • 打赏
  • 举报
回复
sun4216 2007-09-18
怎么都是用MFC呀,有没有SDK的版本呀。谢谢了
  • 打赏
  • 举报
回复
ouyh12345 2007-09-17
dll中,如果没做特殊处理,引用的是应用程序的资源。
得切换到dll的资源中。

用AFX_MANAGE_STATE(AfxGetStaticModuleState());

或得到dll的instance,加载资源时,用此instance
  • 打赏
  • 举报
回复
sun4216 2007-09-17
我用的是SDK呀,有没有SDK的版本?谢谢了
  • 打赏
  • 举报
回复
vocanicy 2007-09-17
这是因为在主程序的资源链中无法查找到这个对话框资源

需要在创建对话框之前将当前资源的handle切换到对话框的资源
hOldRes = AfxGetResourceHandle();
AfxSetResourceHandle(hDLL);

// 创建对话框,结束后将资源句柄恢复
。。。

AfxSetResourceHandle(hOldRes );





我这里写了一个自动切换的简单类,你直接用就可以了


{
AFX_MANAGE_STATE(AfxGetStaticModuleState());

CResourceLock ResLock(g_hModule); // 增加这一句,其中g_hModule是动态库的hInstance,在DllMain中保存的全局变量

CwmaDlg dlg;
dlg.DoModal();
return 0;
}


DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
{
// Remove this if you use lpReserved
UNREFERENCED_PARAMETER(lpReserved);

if (dwReason == DLL_PROCESS_ATTACH)
{
g_hModule = hInstance;
}
......


// h
class CResourceLock
{
public:
CResourceLock(HINSTANCE hInstance);
virtual ~CResourceLock();

private:
HINSTANCE m_hInstance;
};

// cpp
CResourceLock::CResourceLock(HINSTANCE hInstance)
{
m_hInstance = AfxGetResourceHandle();
AfxSetResourceHandle(hInstance);
}

CResourceLock::~CResourceLock()
{
AfxSetResourceHandle(m_hInstance);
}
  • 打赏
  • 举报
回复
相关推荐
发帖
进程/线程/DLL
加入

1.5w+

社区成员

VC/MFC 进程/线程/DLL
申请成为版主
帖子事件
创建了帖子
2007-09-17 05:00
社区公告
暂无公告