2

アプリケーションからGetSystemWow64Direcoryメソッドを使用しようとしています。PInvoke.netのサンプルは正しくないようです。アンマネージ呼び出しに渡す前に配列を固定する必要はありませんか?

[DllImport("Kernel32.dll")]
public static extern int GetSystemWow64Directory([In, Out] char[] lpBuffer
    [MarshalAs(UnmanagedType.U4)] uint size);

char[] path = new char[256];

int result = GetSystemWow64Directory(path, (uint)path.Length);
if (result != 0)
    MessageBox.Show(new String(path, 0, result));
4

3 に答える 3

2

固定する必要はありません - マーシャリングがすべてを処理します。

StringBuilder を使用する必要はありません、使用できます (実際、使用するのがおそらく最善です)。

public static extern int GetSystemWow64Directory(StringBuilder lpBuffer, uint size);
于 2013-02-15T15:53:39.430 に答える
2

まあ、固定する必要はありません。マーシャラーがそれを処理します。

しかし、それは貧弱な p/invoke です。私のアドバイスは、pinvoke.net で見つけたものを信用しないことです。品質は非常に多様です。ここを使いStringBuilderます。

[DllImport("kernel32.dll", CharSet=CharSet.Auto)]
public static extern int GetSystemWow64Directory(
    StringBuilder Buffer, 
    int Size
);
....
StringBuilder Buffer = new StringBuilder(260);
int retVal = GetSystemWow64Directory(Buffer, Buffer.Capacity);
if (retVal != 0)
    MessageBox.Show(Buffer.ToString());
于 2013-02-15T17:09:06.300 に答える
0

ネイティブ メソッドに渡すオブジェクトは、マーシャラーによる呼び出しの間、自動的に固定されます。

詳細については、http://msdn.microsoft.com/en-us/magazine/cc163910.aspx#S2を参照してください。

ネイティブ コードに渡したオブジェクトが非同期で使用される場合 (つまり、オブジェクトを渡す呼び出しの実行が完了した後) にのみ、手動で固定する必要があります。

于 2013-02-15T17:24:30.357 に答える