Во что GetFunctionPointerForDelegate преобразовывает параметр String ^ в делегате? - PullRequest
3 голосов
/ 02 декабря 2011

Я пытаюсь преобразовать делегат C # в указатель на функцию C ++, используя Managed C ++. Вот метод, который мы ранее использовали:

// Define a delegate
public delegate void ADelegate(Int32);
ADelegate^ delegateInstance;

// Define a function pointer
typedef void (__stdcall *AFuntionPointer)(int);
AFuntionPointer functionPointerInstance;

// Create an instance of a delegate, using GetFunctionPointerForDelegate
delegateInstance = gcnew ADelegate(this, &AClass::AFunction);

// Convert the delegate to a pointer
IntPtr anIntPtr = Runtime::InteropServices::Marshal::GetFunctionPointerForDelegate(delegateInstance);

// Cast the pointer into a function pointer
functionPointerInstance = static_cast<AFuntionPointer>(anIntPtr.ToPointer());

Если я поверну параметр ADelegate с Int32 на String^, на какой тип мне следует изменить параметр AFunctionPointer? Другими словами, если я изменил первые две строки в приведенном выше коде на:

public delegate void ADelegate(String ^);
ADelegate^ delegateInstance;

Как мне изменить следующие две строки?

// To what type does GetFunctionPointerForDelegate translate String^ to?
typedef void (__stdcall *AFuntionPointer)( /* char*?  std::string? */ );
AFuntionPointer functionPointerInstance;

1 Ответ

3 голосов
/ 03 декабря 2011

Marshal :: GetFunctionPointerForDelegate () для этого делегата создаст указатель функции, совместимый с

  typedef void (__stdcall *AFuntionPointer)( const char* );

String^ маршалами на const char*, если только атрибут [MarshalAs] не применяется к аргументу делегата.Маршалинг непосредственно в std :: string невозможен, маршаллер pinvoke ничего не знает о макете объекта C ++ для классов, которые объявлены в заголовочном файле.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...