VisualStudioデバッガーのEEAddInとして使用されるマネージC++dllがあります。私のdllは、アンマネージ型を受け入れて返す1つの関数をエクスポートします。dllでの関数の宣言は次のとおりです(DEBUGHELPERは単純な構造です)。
extern "C"
{
#pragma unmanaged
__declspec(dllexport) HRESULT CvMatViewer(DWORD dwAddress, DEBUGHELPER *pHelper,
int nBase, BOOL bUniStrings, char *pResult, size_t max, DWORD reserved)
{
strcpy_s(pResult, max, "Value is processed");
return S_OK;
}
}
私のdllの目的は、Visual Studioデバッガーからの変数を処理し、ウォッチウィンドウに表示する前に任意の方法でそれらをフォーマットすることです(EEAddInの目的は、かなりクールです)。
2つのVisualStudioを起動しました。1つはマネージDLL用で、もう1つはネイティブデバッグ済みexe用です。dllをネイティブexeを実行しているVisualStudioのプロセスにアタッチし、ブレークポイントを設定できます。ユーザーがウォッチウィンドウに変数を追加すると、ブレークポイントに到達します。すべてのパラメーターが正しく渡され、returnステートメントに到達するまで関数が正常に機能していることがわかります。
その後、私はUnhandled exception at 0x51ea9de4 in devenv.exe: 0xC0000005: Access violation reading location 0x00000000
。
管理されていないdllでも同じことがうまく機能します。では、問題がどこに隠れているかを誰かが推測できますか?
どちらのVisualStudioも2010バージョンです。
はい、アンマネージdllを使用してこの呼び出しを受け入れ、別のマネージdllに制御を渡すことができますが、Occamのかみそりの原則ではそうしないように指示されています。
更新:
pResult
NULLではなく、コメントアウトしても例外がスローstrcpy_s
されます。