• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:CXXXApp::InitInstance内でDLLの呼び出し)

DLLの呼び出しでアクセスバイオレイションエラーが発生する問題の解決方法

このQ&Aのポイント
  • CXXXApp::InitInstance内のDLLの呼び出しでアクセスバイオレイションエラーが発生しています。DLLはMFCの共有DLLで作成されており、単純にダイアログを表示するだけの内容です。
  • 問題の原因は、呼び出されるDLLに親ウィンドウがないことです。解決方法を教えてください。
  • 解決方法は、呼び出されるダイアログの親ウィンドウを指定することです。具体的な手順を教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.2

リソースハンドルが DLL側になっていますか? DLL内のリソースを使うのであれば AfxGetResourceHandle()では取得出来ないと思いますよ … CWnd::UpdateWindow()でm_hWndがNULLということは 親ではなく自分自身のように思います CDialog派生クラスの宣言を確かめてみましょう CTestDlg( CWnd* pParent = NULL ); となっているはずです 親ウィンドウの指定無しで使用可能です CWnd::UpdateWindowでアサーションされた場合の呼び出し履歴をさかのぼってどのWindowオブジェクトから呼ばれたのかを調査しましょう

w0a15455
質問者

お礼

さかのぼって調査してみます。 助かりました。ありがとうございます。

その他の回答 (1)

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.1

親ウィンドウが無いためではなく GetProcAddressでNULLが返ってきていませんか? DLL側で AfxGetResouseHandle()を使っていますが これは起動した APPのインスタンスを使ってリソースを探そうとするので面白くありません エクスポート関数に HINSTANCE引数を持たせておいて LoadLibraryの戻り値を渡すようにして AfxSetResoueHandleに渡してみましょう エクスポート関数を extern "C" __declspec( dllexport ) void __stdcall dlgTest( HINSTANCE hInst); といった宣言で AfxSetResouceHandle( hInst ); といった具合にします 呼び出し側では typedef UINT ( CALLBACK* LPMYPROC )(HINSTANCE); といった型定義をして LPMYPROC lpdlg; lpdlg = (LPMYPROC)GetProcAddress( hDll, "_dlgtest@4" ); (*lpdlg)(hDll); といった具合で実行します LoadLibraryに渡す関数名は DEFファイルなどでリネームしていない場合 __stdcallを指定すると _関数名@引数のバイト数合計 といった名前でエクスポートされます

w0a15455
質問者

お礼

親切にありがとうございます。勉強になります。 教えて頂いたとおりにやってみましたが、変わりませんでした。 GetProcAddress関数は、NULLは返していませんでした。 それで、デバックしていると、 _AFXWIN_INLINE void CWnd::UpdateWindow() { ASSERT(::IsWindow(m_hWnd)); ::UpdateWindow(m_hWnd); } という箇所でエラーになっていました。 m_hWndは、NULLでした。 そこで、ためしに、 CTestDlg dlg(CWnd::GetDesktopWindow()); としてみたら、XPでは、正常に表示されました。 98などでは、ダイアログは、表示されますが、ボタンがクリックできない(マウス系の操作ができない)状態になってしまいました。 基本的に、考えなおした方がよいでしょうか?

関連するQ&A