例外が発生したときに extern C++ 関数がメッセージを返すようにしたいと考えています。このようなもの:
extern "C" __declspec(dllexport) const char* __stdcall Calculate(double &result, double a, double b)
{
try
{
result = InternalCalculation(a, b);
}
catch(std::invalid_argument& e)
{
return e.what();
}
return "";
}
double InternalCalculation(double a, double b)
{
if(a < b)
{
const char* err = "parameters error!";
throw std::invalid_argument(err);
}
return sqrt(a - b);
}
一方、C# プログラムから関数を呼び出して、エラーを表示したいMessageBox
:
[DllImport(@"MyDll.dll", EntryPoint = "Calculate")]
private static extern IntPtr Calculate(out double result, double a, double b);
private void Calculate()
{
IntPtr err;
double result = 0;
err = Calculate(out result, out 2, out 3);
var sErr = Marshal.PtrToStringAnsi(err);
if (string.IsNullOrEmpty(sErr))
MessageBox.Show(sErr);
...
}
残念ながら、それは機能しません..MessageBox
ランダムな文字が表示されるだけです。
私が置き換えた場合、私は驚いています:
return e.what();
に:
const char* err = "parameters error!";
return err;
すると「パラメータエラー!」C# コードのメッセージ ボックスに正しく表示されます。err
とはどちらもe.what()
同じ型 ( const char*
) なので、何が問題なのですかe.what()
??