小さなアプリケーションを完成させ、メモリ リークやバグがないことを確認しようとしています。出力を確認した後、関数の 1 つが First-Chance 例外をスローしていることに気付きましたが、関数はうまく機能し、クラッシュしません。
この関数は、CLR C++ DLL 内の別の関数を呼び出します。テストのためだけに DLL 関数のほとんどすべてのコードを削除しましたが、それでも例外がスローされるため、EXE 関数が問題であることがわかります。
これは、EXE 関数が DLL 関数を呼び出すためのコードです。
LPCTSTR CHAXC0RDlg::Encrypt(LPCTSTR strValue)
{
const char* Return;
HINSTANCE hDLL = LoadLibrary(L"Library.dll");
if(hDLL)
{
FARPROC hMethod = GetProcAddress(HMODULE (hDLL), "Encrypt");
if(hMethod)
{
typedef const char* (*FunctionSig)(LPCTSTR);
FunctionSig MethodCall = FunctionSig(hMethod);
Return = MethodCall(strValue);
FreeLibrary(hDLL);
}
}
return _tcsdup(CString(Return));
}
これは DLL 関数です (ご覧のとおり、テストとして戻り値を生成するコードを除くすべてのコードを削除しました)。
const char* Encrypt(LPCTSTR strPValue)
{
String^ strValue = gcnew String(strPValue);
string strReturn = (const char*)(Marshal::StringToHGlobalAnsi(strValue)).ToPointer();
char* csValue = new char[strReturn.size()];
strcpy(csValue, strReturn.c_str());
return const_cast<const char*> (csValue);
}
EXE 関数は " const char* Return = MethodCall(strValue);
" で例外をスローします (私が知っている方法であるこの例外でブレークを有効にしました)。
この関数がこの例外をスローするのはなぜですか?
ありがとう!
編集
更新: 私の文字セットは UNICODE です。
更新#2:提案と回答で読んだことから、このコードは機能しないと想定していますが、機能します。すべてのバグをなくして、このプログラムを高品質にしたかったので、初回例外でのブレークを有効にしました (もちろん、初回例外が何であるかは知っています)。コードは正常に実行されます。私はより優れたプログラマーになりたいので、初回例外がスローされる理由を理解したかっただけです。ですので、これを修正したいと思います。
更新 #3: コードで hDLL と hMethod の値をチェックするようになりましたが、この関数を実行すると両方とも null ではありません。問題は、DLL への呼び出し自体にあるようです。このコードが機能するため、関数のシグネチャは 100% 正しいと想定しています。最初の例外がスローされるだけです。
更新 #4: 上記の関数に新しい変更を加え、DLL 関数コードを追加しました。DLL 関数は CLR C++ DLL です。既に述べたように、DLL 関数内のすべてのコードを削除して、それが自分の DLL でないことを確認しました。