0

我已将* MFC * 项目从VC 6迁移VS 2010项目。现在我们实现的自定义对话框使用 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没有出现这个问题。而且这个问题怎么解决!

4

5 回答 5

1

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

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

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

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

于 2012-10-15T00:39:51.847 回答
0

尝试更改为您的IDD_YOURDIALOG. 也许它与 MFC 10.0 中的一些新资源冲突?

于 2012-10-15T09:25:31.403 回答
0

缺少资源时出现问题。1- 将适当的 rc 文件添加到显示问题的项目中。2-解决了资源中的一些重复问题。

仍然不明白为什么它在旧项目中工作而在新项目中失败。

于 2012-10-16T13:28:06.303 回答
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 );
....
}
于 2015-04-11T21:20:59.227 回答
0

我认为您的 HINSTANCE 不正确。您可以按如下方式获得 HINSTANCE:

HINSTANCE hInstance = (HINSTANCE)GetModuleHandle( NULL );

因此,以下代码应该可以工作:

hInst = (HINSTANCE)GetModuleHandle( NULL );
HRSRC hResource = ::FindResource(hInst, m_lpszTemplateName, RT_DIALOG);
hDialogTemplate = LoadResource(hInst, hResource);
于 2012-10-15T07:00:49.790 回答