【问题标题】:DoModal not working after migration to VS 2010迁移到 VS 2010 后 DoModal 不起作用
【发布时间】:2012-10-04 18:25:39
【问题描述】:

我已迁移 *MFC* 项目从 VC 6VS 2010 项目。 现在,我们实现的 自定义对话框 使用了 CDialog::DoModal,但它不起作用,并且在这一行失败 HRSRC hResource = ::FindResource(hInst, m_lpszTemplateName, RT_DIALOG) 正如在新项目中它返回 Null,而在中它获得一个值。 - 项目正常构建,所以我认为我不会忘记导入 资源? - 如果这可能与问题有关,我在新项目中使用 ribbons? - 我应该将自定义对话框的继承更改为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中。 以及如何解决这个问题!

【问题讨论】:

  • LPCTSTR m_lpszTemplateName;对于 afxwin.h 和 afxext.h 中的 CDialog、CDialogBar 和 CFormView

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


【解决方案1】:

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

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

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

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

【讨论】:

  • - 是的,对话框不在可执行文件中,它在另一个 DLL 中。 - 如何获取其他模块的HINSTANCE??
  • 如果你知道模块的名字,调用GetModuleHandle(),把模块的名字作为arg。
【解决方案2】:

我认为您的 HINSTANCE 错误。您可以通过以下方式获取 HINSTANCE:

HINSTANCE hInstance = (HINSTANCE)GetModuleHandle( NULL );

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

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

【讨论】:

  • 这段代码在CDialog的DoModal中,无法编辑。我认为这行不通。
【解决方案3】:

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

【讨论】:

  • 我检查了Dialod ID,没有发现任何冲突。
  • 您是否尝试过更改它并重建您的解决方案?另外,我想知道您的对话框是否包含任何特殊的 COM 控件?
【解决方案4】:

可能为时已晚,但我发现这篇文章是因为我遇到了类似的问题。问题出在 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 );
....
}

【讨论】:

    【解决方案5】:

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

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

    【讨论】:

      猜你喜欢
      • 2017-08-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-26
      • 1970-01-01
      • 2017-07-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多