Unsigned char **在c#中是等价的,并且必须在文件中写入返回值
本文关键字:文件 返回值 char Unsigned | 更新日期: 2023-09-27 17:49:15
我必须调用win32 dll函数
int func1( int arg1, unsigned char **arg2, int *arg3);
和我需要在c#中包装为
public extern int fuc1(int arg1, out IntPtr arg2, out IntPtr arg3);
,我在c#应用程序中调用它为
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();
我在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"是释放字符串的函数,否则没有文档记录。
您可能需要使用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