2009-07-22 3 views
1

Я новичок в C# и визуальной студии. У меня есть C# GUI, который передает параметры функциям, экспортированным из C++ DLL. Платформа в Visual Studio 2005.Marshaling от C# до C++

У меня есть функция в C DLL ++, которые принимают параметры следующих типов: UINT8 UInt16 LPCWSTR someword (был определен в C + = DLL следующее: ЬурейеЕ ничтожной * somord..so в основном someord - это просто указатель на пустоту.)

Не могли бы вы мне помочь, как передать параметры из моего графического интерфейса C# в эту функцию, импортированную из DLL. Я знаю, что это нужно делать с помощью маршалов, но я не знаю, как это сделать. также dll C++ неуправляема. Любая помощь будет оценена.

Спасибо, Viren

+0

@Viren: Пожалуйста, вы можете указать точное определение функции (в DLL C++)? –

+0

уверен, что это: int function (someord somevariable, UINT16 var1, UINT8 var2, UINT8 var3, UINT8 var4, LPCWSTR str1, LPCWSTR str2); – zack

+0

Ну, так как вы упоминаете, что какой-то знак был определен как void *, очень важно то, что укажет этот указатель на void (какой тип структуры), или иначе, если ti является просто «сквозным» указателем, вы могли бы используйте переменную IntPtr для представления адреса указателя. Тем не менее, дело в том, что для получения полного ответа требуется еще одна ясность! –

ответ

0

Попробуйте что-то вроде этого:

[DllImport("lib.dll")] 
public static extern int FunctionName(IntPtr somevariable, ushort var1, byte var2, byte var3, byte var4, [MarshalAs(UnmanagedType.LPWStr), In] string str1, [MarshalAs(UnmanagedType.LPWStr), In] string str2);
+0

thanks..btw Я импортирую dll, используя следующий оператор: [DllImport ("lib.dll", CharSet = CharSet.Ansi)] так что 'charset' будет иметь значение для того, что вы предложили ранее? – zack

+0

Я думаю, что он должен работать должным образом, если вы явно укажете, как маршалировать каждую строку, но я бы проверил только, чтобы убедиться и начать беспокоиться, если это не так :). –

+0

IntPtr работает отлично .. многое. – zack

1

Не могли бы вы помочь нам, предоставив подпись ++ DLL C? Для типов, которые вы указали, вот правильные типы

  • UINT8: Uint8
  • UInt16: UInt16
  • LPCWSTR: String (убедитесь, что использовать [В] Marshal приписывать от параметра а)

Вы еще проверили помощника PInvoke Interop? Он был разработан, чтобы помочь людям с помощью этих сценариев путем преобразования подписей C++ в эквивалентный импорт DLL

+0

спасибо JaredPar за ссылку..Я использовал байт, ushort и строку для типов соответственно, и он отлично работает. – zack

+1

байт - это всего лишь shorcut для System.UInt8, ushort - для System.UInt16 и строки для System.String, так что вы ближе к решению JaredPar, которое вы думаете ;-). –

Смежные вопросы