我有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);
但是当我从C#调用InstallMailHandler和UninstallMailHandler并在参数中使用相同的函数时,它会导致C ++中的地址不同,因此无法卸载以前安装的邮件处理程序。
是否有可能以某种方式确保两个调用都会产生相同的函数地址,或者可能明确地设置一个地址?
答案 0 :(得分:1)
我认为问题是每个调用都会创建新的委托对象。
你可能会这样称呼它们:
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);