概要
- Visual Studio 2015のRCP.dllを利用するC++のプログラムで、プロジェクトの出力先のパスによっては例外が表示されることがあった。
エラー内容
エラーメッセージ
0x03479E52 (RCP.dll) で例外がスローされました (hogehoge.exe 内): 0xC0000005: 場所 0x0400306E の読み取り中にアクセス違反が発生しました
発生個所
以下のreturn pDlg->OnInitDialog();
の個所でエラーが発生する
dlgcore.cpp
/////////////////////////////////////////////////////////////////////////////
// AfxDlgProc - does nothing since all messages are handled via AfxWndProc
INT_PTR CALLBACK AfxDlgProc(HWND hWnd, UINT message, WPARAM, LPARAM)
{
if (message == WM_INITDIALOG)
{
// special case for WM_INITDIALOG
CDialog* pDlg = DYNAMIC_DOWNCAST(CDialog, CWnd::FromHandlePermanent(hWnd));
if (pDlg != NULL)
return pDlg->OnInitDialog();
else
return 1;
}
return 0;
}
発生条件
次の条件を満たす場合にエラーが発生する
- アセンブリの出力先を既定値の
$(SolutionDir)$(Configuration)\
としている
- 出力先の階層が深い(パスが長い?)場合。
- 次の例は極端な例となる。パスの階層が原因なのか、長さが原因となるかは調査していない
- 例:
C:\Users\user123.domain\source\repos\gitserver\workfolder\projectA\projectA\projectA\projectA\projectA\projectA\projectA\projectA\projectA
対処
方法1
- アセンブリの出力先を変更する(例:
.\execute\VS2015\$(Configuration)\
)
方法2
- ソリューション、プロジェクトの配置場所を浅くする