0

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されます。

4

2 に答える 2

1

stdcallこの関数に呼び出し規約を明示的に設定する必要があるようです。これが役立つはずです。

__declspec(dllexport) HRESULT __stdcall CvMatViewer(DWORD dwAddress, DEBUGHELPER *pHelper, 
    int nBase, BOOL bUniStrings, char *pResult, size_t max, DWORD reserved);
于 2012-07-03T20:55:48.143 に答える
0

データをコピーする前に、pResultが実際にnullポインターではないかどうかを確認します。関数のサイズを考えると、これはおそらく問題です。

于 2012-07-03T19:22:06.453 に答える