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

sun4216 2007-09-17 05:00:31
如题
...全文
186 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
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);
}

15,471

社区成员

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

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