サンプル集 |
■VC ■C# ■Java ■BorlandC ■LinuxC ■MS-DOS ■bash ■Excel VBA ■VBScript ■PHP ■HTML ■perl ■iPhone ■Android ■Lua ■other |
Linuxコマンド |
用語集 |
debian メモ |
apache2 メモ |
MySQL メモ |
Oracle メモ |
HOME |
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
);
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);
}
{
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"));
}
{
wcscpy(outStr, _T("11112222333344445566"));
}
色々試した結果、StringBuilderの初期値を64にしたところエラーが出なくなりました。
var sb = new StringBuilder(64);
StringBuilderでデフォルトで確保される領域がオーバーフローしていたのでしょうか。
Copyright (C) 2019 ymlib.com