2

win32 dll 関数を呼び出す必要があります

int func1( int arg1, unsigned char **arg2, int *arg3);

そして、私はC#でラップする必要があります

public extern int fuc1(int arg1, out IntPtr arg2, out IntPtr arg3);

そして私はそれをac#アプリケーションから次のように呼び出しました

int arg1;
IntPtr arg2 = IntPtr.Zero;
IntPtr arg3 = IntPtr.Zero;
func1(arg1,out arg2,out arg3);

関数は C# ラッパーで宣言され、C# テスト アプリで呼び出されますか? ここで、arg2 をテキスト ファイルに保存する必要があります。どうやってするか。

ハンスから回答を得て、私はそれを使用してファイルに書きました

System.IO.StreamWriter(@Application.StartupPath + "\\Filename.txt");
file.WriteLine(arg2);
file.Close();
4

2 に答える 2

1

私はメモリをクリアするためにdllに空き機能があります

次に、この作業を行うためのショットがあります。関数宣言は次のようになります。

[DllImport("foo.dll", CallingConvention = CallingConvention.Cdecl)]
private static extern int func1(int arg1, out IntPtr arg2, ref int arg3);

そして、あなたはそれをこのように呼ぶでしょう:

IntPtr ptr = IntPtr.Zero;
int dunno = 99;
string result = null;

int retval = func1(42, out ptr, ref dunno);
if (retval == success) {
    result = Marshal.PtrToStringAnsi(ptr);
    // etc...
}
if (ptr != IntPtr.Zero) func1free(ptr);

ここで、「func1free」は、文字列を解放する、文書化されていない関数です。

于 2012-12-21T16:24:02.473 に答える
1

おそらく、次のようなMarshalAs属性を使用する必要があります。

public static extern int func1(int arg1, [MarshalAs(UnmanagedType.LPStr)] string arg2, IntPtr arg3);

ドキュメントについては、こちらをご覧ください。

http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.marshalasattribute.aspx

于 2012-12-21T13:48:12.417 に答える