- ベストアンサー
DLLの呼び出しでアクセスバイオレイションエラーが発生する問題の解決方法
- CXXXApp::InitInstance内のDLLの呼び出しでアクセスバイオレイションエラーが発生しています。DLLはMFCの共有DLLで作成されており、単純にダイアログを表示するだけの内容です。
- 問題の原因は、呼び出されるDLLに親ウィンドウがないことです。解決方法を教えてください。
- 解決方法は、呼び出されるダイアログの親ウィンドウを指定することです。具体的な手順を教えてください。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
リソースハンドルが DLL側になっていますか? DLL内のリソースを使うのであれば AfxGetResourceHandle()では取得出来ないと思いますよ … CWnd::UpdateWindow()でm_hWndがNULLということは 親ではなく自分自身のように思います CDialog派生クラスの宣言を確かめてみましょう CTestDlg( CWnd* pParent = NULL ); となっているはずです 親ウィンドウの指定無しで使用可能です CWnd::UpdateWindowでアサーションされた場合の呼び出し履歴をさかのぼってどのWindowオブジェクトから呼ばれたのかを調査しましょう
その他の回答 (1)
- redfox63
- ベストアンサー率71% (1325/1856)
親ウィンドウが無いためではなく 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を指定すると _関数名@引数のバイト数合計 といった名前でエクスポートされます
お礼
親切にありがとうございます。勉強になります。 教えて頂いたとおりにやってみましたが、変わりませんでした。 GetProcAddress関数は、NULLは返していませんでした。 それで、デバックしていると、 _AFXWIN_INLINE void CWnd::UpdateWindow() { ASSERT(::IsWindow(m_hWnd)); ::UpdateWindow(m_hWnd); } という箇所でエラーになっていました。 m_hWndは、NULLでした。 そこで、ためしに、 CTestDlg dlg(CWnd::GetDesktopWindow()); としてみたら、XPでは、正常に表示されました。 98などでは、ダイアログは、表示されますが、ボタンがクリックできない(マウス系の操作ができない)状態になってしまいました。 基本的に、考えなおした方がよいでしょうか?
お礼
さかのぼって調査してみます。 助かりました。ありがとうございます。