迁移到VS 2010后,DoModal无法正常工作

时间:2012-10-14 17:00:33

标签: c++ visual-c++ mfc

我已 VC 6 <项目项目迁移 * MFC *项目。 现在一个自定义对话框我们实现了使用CDialog :: DoModal 但它无法正常工作,它在此行失败 HRSRC hResource = :: FindResource(hInst,m_lpszTemplateName,RT_DIALOG)新项目一样,返回Null ,在中,获取值。   - 项目正常构建,所以我认为我不会忘记导入资源?   - 如果这可能与问题有关,我在新项目中使用色带?   - 我应该将自定义对话框的继承更改为 CDialogEx 吗?

更新 我创建了一个新的自定义对话框,继承了CDialog和DoModal非常有效 问题在于那些行完全在DoModal

hInst = AfxFindResourceHandle(m_lpszTemplateName, RT_DIALOG);
HRSRC hResource = ::FindResource(hInst, m_lpszTemplateName, RT_DIALOG);
hDialogTemplate = LoadResource(hInst, hResource);

由于hInst没有正常返回,所以所有其他调用都失败了。 该问题与使用另一个dll中的对话框和资源有关。 我仍然不明白为什么问题出现在VS2010中并且没有出现在VS 6中。 怎么可以解决这个问题!

5 个答案:

答案 0 :(得分:1)

嗯,它没有找到资源,所以有两种可能性:

1)资源不在您的可执行文件中 2)包含资源的模块不在MFC资源链中

首先,打开您认为该资源位于IDE中的.exe或.dll文件。在IDE中打开模块时,它将作为资源文件打开。搜索模块中的对话框并验证它确实在模块中。

如果确实验证了资源在模块中,那么在调用DoModal()之前,使用包含资源的模块的HINSTANCE调用AfxSetResourceHandle()。

答案 1 :(得分:0)

我认为你的HINSTANCE错误了。你可以按如下方式获得HINSTANCE:

HINSTANCE hInstance = (HINSTANCE)GetModuleHandle( NULL );

因此,以下代码应该起作用:

hInst = (HINSTANCE)GetModuleHandle( NULL );
HRSRC hResource = ::FindResource(hInst, m_lpszTemplateName, RT_DIALOG);
hDialogTemplate = LoadResource(hInst, hResource);

答案 2 :(得分:0)

尝试更改IDD_YOURDIALOG的指定号码。也许它与MFC 10.0中的一些新资源冲突?

答案 3 :(得分:0)

缺少资源的问题。 1-添加适当的rc文件以预测显示的问题。 2-解决了资源中的一些重复问题。

仍然没有理解为什么它在旧项目中工作而在新项目中失败了。

答案 4 :(得分:0)

可能为时已晚,但我发现这篇帖子是因为我遇到了类似的问题。问题出在Vista对话框样式中,这在VS2010中是默认的。我刚刚在基类初始化中添加了两个零,它开始像以前一样工作:

IMPLEMENT_DYNAMIC(LoadAscii_dlg, CFileDialog)

LoadAscii_dlg::LoadAscii_dlg(LPCTSTR lpszFileName) :
        CFileDialog( TRUE, "txt", lpszFileName, 
        OFN_OVERWRITEPROMPT | OFN_HIDEREADONLY | OFN_ENABLETEMPLATE | OFN_EXPLORER,
        "Text Files (*.txt)|*.txt|Comma Separated Values (*.csv)|*.csv|All Files (*.*)|*.*||", 0,**0,0** )

{
    m_ofn.lpTemplateName = MAKEINTRESOURCE( IDD_LOADASCII );
....
}