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

リソースが見つからないため、次の 2 つの可能性があります。

1) リソースが実行可能ファイルにない 2) リソースを含むモジュールが MFC リソース チェーンにない

まず、リソースが含まれていると思われる .exe または .dll ファイルを IDE で開きます。モジュールを IDE で開くと、リソース ファイルとして開きます。モジュール内のダイアログを検索し、それが実際にモジュール内にあることを確認します。

リソースがモジュール内にあることを確認した場合は、DoModal() を呼び出す前に、リソースを含むモジュールの HINSTANCE を指定して AfxSetResourceHandle() を呼び出します。

于 2012-10-15T00:39:51.847 に答える
0

不足しているリソースに問題がありました。1-問題を示したプロジェクトに適切なrcファイルを追加しました。2-リソースの重複を解決しました。

それでも、古いプロジェクトで機能していて、新しいプロジェクトで失敗した理由がわかりませんでした。

于 2012-10-16T13:28:06.303 に答える
0

手遅れかもしれませんが、同様の問題があったため、この投稿を見つけました。問題は、VS2010 のデフォルトである Vista ダイアログ スタイルにあります。基本クラスの初期化に 2 つのゼロを追加しただけで、以前と同じように機能し始めます。

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 に答える
0

に割り当てられた番号を変更してみてくださいIDD_YOURDIALOG。MFC 10.0 の新しいリソースと競合する可能性がありますか?

于 2012-10-15T09:25:31.403 に答える