2012-12-21 4 views
2

я должен вызвать функцию DLL win32неподписанные символ ** эквивалент в C# и должны написать возвращаемое значение в файле

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

и мне нужно, завернутые в C#, как

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

и я назвал его от переменного тока # применения в качестве

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

объявлена ​​функция в C# обертке, а также называется в C# тест приложение правильно? Теперь мне нужно сохранить arg2 в текстовом файле. Как это сделать.

Got ответ от Ганса и я написал его в файл с помощью

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

Последний аргумент - 'ref int'. Вряд ли вы можете вывести эту функцию, строка должна быть выпущена после преобразования с помощью Marshal.PtrToStringAnsi(). Вы не можете, это приведет к утечке памяти. –

+0

@HansPassant У меня есть бесплатная функция в dll для очистки памяти – Narayan

ответ

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» является иначе недокументированная функция, которая освобождает строку.

+0

Это сработало, но третий аргумент arg3 не является ссылкой на arg2. Арг2 и arg3 - это значения. arg2 - это буфферваль, а arg3 - длина значения буфера. – Narayan

+0

Считайте это еще одним чудом сегодня, когда это сработало. –

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

+0

Спасибо за ответ. Я забываю упомянуть в первый раз, что получаю выходное значение в arg2. Теперь я получаю вывод, но я пропускаю несколько байтов в arg2 – Narayan