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

您可能需要使用该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 回答
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 回答