6

次のような関数をインポートしたいと思います。

[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" 方法を使用することの何が問題になっていますか?

4

1 に答える 1