假设我在某些类型库 Foo.tlb 中定义了COM接口IFoo
。
我还有用C ++编写的非托管DLL,它导出以下函数(期望作为实现IFoo
的输入COM对象):
#import "Foo.tlb"
__declspec(dllexport) void MyFunc(Foo::IFoo* p)
{
...
}
现在,我已经在代码中的某处使用IFoo^
编写了用C ++ / CLI编写的托管程序集。我将项目引用添加到上面的DLL并想要调用MyFunc()
。
以下代码的正确语法是什么?如何指定CLR以执行从IFoo^
到IFoo*
的编组操作? (我希望它自动创建COM Callable Wrapper)
__declspec(dllexport) void MyFunc(Foo::IFoo* p);
void CallDLL(Foo::IFoo^ f)
{
MyFunc(f);
}
的 解决方法:
如果我更改代码以将参数传递为void *
并手动创建CCW - 它可以工作:
Unmanaged(C ++):
#import "Foo.tlb"
__declspec(dllexport) void MyFunc(void* p)
{
Foo::IFoo *pFoo = (Foo::IFoo *)p;
...
}
托管(C ++ / CLI):
__declspec(dllexport) void MyFunc(void *p);
void CallDLL(Foo::IFoo^ f)
{
IntPtr p;
try
{
p = Marshal::GetComInterfaceForObject(f, Foo::IFoo::typeid);
MyFunc((void *)p);
}
finally
{
Marshal::Release(p);
}
}
但我怎么能强力打字呢?