次のような関数をインポートしたいと思います。
[return: MarshalAs(UnmanagedType.LPWStr)]
[DllImport("DLL.dll", EntryPoint="FuncUtf16", ExactSpelling=true, PreserveSig=true, CharSet=CharSet.Unicode)]
public static extern string Func();
しかし、これは私に次のようなエラーを与えます:
「Windows が Test.exe でブレークポイントをトリガーしました。ヒープの破損が原因である可能性があります。これは、Test.exe または読み込まれた DLL のバグを示しています。」
そして、「続行」を繰り返し押すと、関数は期待される出力を提供します。ただし、上記の宣言を次のようにする場合:
[DllImport("DLL.dll", EntryPoint="FuncUtf16", ExactSpelling=true, PreserveSig=true, CharSet=CharSet.Unicode)]
public static extern IntPtr Func();
(戻り値の型を IntPtr に変更) し、次のように呼び出します。
Dim a As IntPtr = Func()
Dim Str As String = Runtime.InteropServices.Marshal.PtrToStringUni(a)
、エラーは発生せず、完全に正常に動作します! dll で関数を宣言する "MarshalAs" 方法を使用することの何が問題になっていますか?