Domanda

I have to call a win32 dll function

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

and i need wrapped in c# as

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

and i called it from a c# application as

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

Is the function declared in the c# wrapper as well as called in C# test app Correct ? Now i need to store the arg2 in a text file. How to do that.

Got answer from Hans and i wrote it in a file using

System.IO.StreamWriter(@Application.StartupPath + "\\Filename.txt");
file.WriteLine(arg2);
file.Close();
È stato utile?

Soluzione

i have a free function in the dll to clear the memory

Then you have a shot at making this work. The function declaration ought to look like this:

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

And you'd call it like this:

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);

Where "func1free" is the otherwise undocumented function that releases the string.

Altri suggerimenti

You probably need to use the MarshalAs attribute, for example:

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

Check here for documentation:

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top