我创建了一个MFC规则DLL,其功能就是画一个对话框。
使用对话框的函数为:
extern "C" __declspec(dllexport) void load()
{
CMyDialog dlg;
dlg.DoModal();
}
头文件声明为:
extern "C" __declspec(dllexport) void load();
我在调用这个load()时发现,窗口无法显示,程序在DoModal()时退出了;INT_PTR CDialog::DoModal()
{
// can be constructed with a resource template or InitModalIndirect
ASSERT(m_lpszTemplateName != NULL || m_hDialogTemplate != NULL ||
m_lpDialogTemplate != NULL); // load resource as necessary
LPCDLGTEMPLATE lpDialogTemplate = m_lpDialogTemplate;
HGLOBAL hDialogTemplate = m_hDialogTemplate;
HINSTANCE hInst = AfxGetResourceHandle();
if (m_lpszTemplateName != NULL)
{
hInst = AfxFindResourceHandle(m_lpszTemplateName, RT_DIALOG);
HRSRC hResource = ::FindResource(hInst, m_lpszTemplateName, RT_DIALOG);
hDialogTemplate = LoadResource(hInst, hResource);
}
if (hDialogTemplate != NULL)
lpDialogTemplate = (LPCDLGTEMPLATE)LockResource(hDialogTemplate);
就是在这个 if (hDialogTemplate != NULL) 时退出的。求教高手,我什么地方写错了
使用对话框的函数为:
extern "C" __declspec(dllexport) void load()
{
CMyDialog dlg;
dlg.DoModal();
}
头文件声明为:
extern "C" __declspec(dllexport) void load();
我在调用这个load()时发现,窗口无法显示,程序在DoModal()时退出了;INT_PTR CDialog::DoModal()
{
// can be constructed with a resource template or InitModalIndirect
ASSERT(m_lpszTemplateName != NULL || m_hDialogTemplate != NULL ||
m_lpDialogTemplate != NULL); // load resource as necessary
LPCDLGTEMPLATE lpDialogTemplate = m_lpDialogTemplate;
HGLOBAL hDialogTemplate = m_hDialogTemplate;
HINSTANCE hInst = AfxGetResourceHandle();
if (m_lpszTemplateName != NULL)
{
hInst = AfxFindResourceHandle(m_lpszTemplateName, RT_DIALOG);
HRSRC hResource = ::FindResource(hInst, m_lpszTemplateName, RT_DIALOG);
hDialogTemplate = LoadResource(hInst, hResource);
}
if (hDialogTemplate != NULL)
lpDialogTemplate = (LPCDLGTEMPLATE)LockResource(hDialogTemplate);
就是在这个 if (hDialogTemplate != NULL) 时退出的。求教高手,我什么地方写错了
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
CMyDialog dlg;
dlg.DoModal();
}
一个exe去调用一个dll的引出函数去创建对话框的时候(对话框的资源属于dll),
如果此 DLL 动态链接到 MFCDLL,从此 DLL 导出并调入 MFC 的任何函数在函数的最前面
都必须添加 AFX_MANAGE_STATE 宏。
AFX_MANAGE_STATE(AfxGetStaticModuleState());
但是在扩展的dll中就不可以,
AFX_MANAGE_STATE(AfxGetAppModuleState()); 加这句
AfxSetResourceHandle(theApp.m_hInstance);
CMyDialog dlg;
AfxSetResourceHandle(old_hinst);dlg.DoModal();
创建窗口的时候这样
可能你没有资源切换吧