将指针从托管C ++ / CLI传递到ActiveX C ++组件

问题描述

|| 我有一个用C ++内置的ActiveX组件。其方法之一具有此签名:
short Component::Method(short FAR* ptr) {}
当我将ActiveX添加到我的C ++ / CLI应用程序中时 方法签名显示为:
short Compnenet::Method(short% ptr) {}
我希望能够正确传递短* pSomething;此方法的可变值。 当然,新签名不接受传递的简短参数* 即使您尝试将%转换为空值,也不会给出正确的结果。 注意:我无权更改activeX控件。我只能确认activeX方法收到的地址值。该方法打印传递的值,如下所示:
short Component::Method(short FAR* ptr) {
    char buffer[128];
    sprintf_s(buffer,\"address of ptr = %p\\n\",ptr);
    OutputDebugString(buffer);
}
    

解决方法

该函数签名对于ActiveX自动化无效,必须将数组作为SAFEARRAY传递。照原样,该函数不能由本机C / C ++以外的任何代码调用。类型库转换器具有相同的问题,函数签名与通过引用传递参数的函数签名相同。它无法猜测它实际上是一个数组。这就是为什么您得到short%类型的原因。 如果您无法更改本机组件,则必须编辑Tlbimp.exe生成的互操作库。这需要运行ildasm.exe将DLL反编译为IL。编辑函数的IL声明。将矮胖和ilasm.exe放在一起。查看一个具有您需要知道如何编辑IL的签名的测试功能的反汇编。您需要将参数作为IntPtr传递,并传递固定的数组。使用pin_ptr <>获取该指针。