サンプル集  >  C#  >  ユーザー マーシャリング エラー
COM-interop または PInvoke のユーザー マーシャリング エラー
2019/07/03

C#とwchar_t型の受け渡しでユーザーマーシャリングエラーが出ました。



◆環境
OS Windows 7 Professional Service Pack 1 64bit

C#からはStringBuilderを渡します。

呼び出し側のDllImport(C#)
[DllImport("wchartTest.dll", EntryPoint = "GetWCharT")]
static extern string GetWCharT(
    [MarshalAs(UnmanagedType.LPWStr)]StringBuilder outStr
);

引数にStringBuilderを指定し、MarchalAsでUnmanagedType.LPWStrを指定します。

呼び出し側の呼び出し(C#)
static void Main(string[] args)
{
    var sb = new StringBuilder();
    GetWCharT(sb);
    Console.WriteLine("outSb={0}", sb);
}

VC++のdllではTCHAR*で受けます。 受け取ったTCHAR*に文字列をwcscpyでコピーします。

dll側(VC++)
void __stdcall GetWCharT(TCHAR* outStr)
{
    wcscpy(outStr, _T("11112222333344445566"));
}

色々試した結果、StringBuilderの初期値を64にしたところエラーが出なくなりました。

    var sb = new StringBuilder(64);

StringBuilderでデフォルトで確保される領域がオーバーフローしていたのでしょうか。

▲ PageTop  ■ Home


Copyright (C) 2019 ymlib.com