Указатель на функцию как параметр метода COM - PullRequest
0 голосов
/ 24 октября 2011

Я создал COM-сервер на C ++, который используется из приложения C #.Теперь мне нужно добавить еще один метод в мой COM-объект, и одним из его параметров должен быть указатель на функцию обратного вызова.Исходная функция C ++ выглядит так:

typedef int (__stdcall *tCallBackFunc)(int Param);

void MyFunc(void* CallBackFunc)
{
  int Param;
  //some code
  ((tCallBackFunc)(CallBackFunc))(Param); //call callback function
}

Мне нужно добавить MyFunc как метод COM-объекта.Диалоговое окно «Добавить метод» VS VC ++ предлагает некоторые предопределенные типы для параметра метода COM, такие как «int *» или «bstr», я пытался определить параметр «CallBackFunc» как тип «int *», но я не смог заставить его работать вC #:

public delegate int  tCallBackFunc(int Param);
...
tCallBackFunc cb; //I will initialize it when it is compiled
MyCOMObject.MyFunc(cb); //cannot find any way to cast cb to "ref int"

Кажется, я использую неправильный подход, есть ли быстрый способ объявить указатель на функцию в качестве параметра метода COM-объекта в C ++, а затем использовать его в C #?

Ответы [ 2 ]

7 голосов
/ 24 октября 2011

Способ COM состоит в том, чтобы сделать параметр указателем интерфейса, и чтобы интерфейс объявил функцию обратного вызова.

1 голос
/ 24 октября 2011

+ 1 за ответ Фредерика.

@ Майкл: Это окажется намного проще, чем ваше воображаемое решение.Особенно при

  • времени жизни объекта
  • границы процесса
  • безопасность потока (границы квартиры, IOW)
  • соответствие стандартам (указатели на функцию приведения быстро входят вдомен неопределенного поведения). Почему вы должны волноваться?Соответствие стандартам должно касаться вас в случае, если обновление компилятора вводит другую оптимизацию, которая делает ваш старый (не соответствующий) разрыв кода
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...