Вызов двух функций в C ++ и передача им одного и того же делегата в C # - PullRequest
3 голосов
/ 17 февраля 2012

У меня есть проект C ++ с функциями:

_API void __stdcall  InstallMailHandler(MailHdlPtrType Hdl)
{ ... }
_API void __stdcall  UninstallMailHandler(MailHdlPtrType Hdl)
{ ... }

typedef void (STDCALL  *MailHdlPtrType)(unsigned char instNo, bla bla bla);

И у меня в C #:

public static extern void InstallMailHandler(MailHdlPtrType Hdl);
public static extern void UninstallMailHandler(MailHdlPtrType Hdl);

public delegate void MailHdlPtrType(byte instno, bla bla bla);

Но когда я вызываю InstallMailHandler и UninstallMailHandler из C # с той же функцией в аргументах,это приводит к различным адресам в C ++, поэтому он не может удалить ранее установленный почтовый обработчик.

Можно ли как-то гарантировать, что оба вызова приведут к одному и тому же адресу функции, или, возможно, установить адрес явно?

1 Ответ

1 голос
/ 17 февраля 2012

Мне кажется, проблема в том, что новый объект делегата создается при каждом вызове.

Вы, вероятно, вызываете их так:

InstallMailHandler(new MailHdlPtrType(YourCoolFunction));
// ...
UninstallMailHandler(new MailHdlPtrType(YourCoolFunction));

или в эквивалентной краткой форме:

InstallMailHandler(YourCoolFunction);
// ...
UnnstallMailHandler(YourCoolFunction);

Я думаю, вам просто нужно сохранить одного и того же делегата:

MailHdlPtrType my_deleg = new MailHdlPtrType(YourCoolFunction); // this may be field in your class or something
//...
InstallMailHandler(my_deleg);
// ...
UnnstallMailHandler(my_deleg);
...