gpt4 book ai didi

c++ - 在没有 Wrapper 类的情况下调用 ActiveX 接口(interface)上的方法

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:42:11 25 4
gpt4 key购买 nike

我正在使用没有源代码的 3d 派对 ActiveX 组件。我可以将组件添加到我的 MFC 对话框中。当我这样做时,会创建一个包装类,其中包含许多如下所示的函数:

void SetNextMovePCI2FastLink(short nNodeNumber, short nCardNumber)
{
static BYTE parms[] = VTS_I2 VTS_I2 ;
InvokeHelper(0x109, DISPATCH_METHOD, VT_EMPTY, NULL, parms, nNodeNumber, nCardNumber);
}

使用这些包装函数我可以正常操作。但是,由于从不同线程访问 COM 对象,我需要为该对象编码 COM 接口(interface)。如何在没有包装器的情况下直接调用 COM 接口(interface)上的方法?有没有一种简单的方法可以将包装器应用于原始 COM 接口(interface),以便可以重新使用包装器?或者我是否必须使用 IDispatch 接口(interface)的 Invoke() 方法?如果是这样,有没有办法找出要调用的真正方法名称字符串是什么?包装器使用上面的 0x109 之类的数字来寻址每个方法。我能否以某种方式利用包装器的 InvokeHelper() 直接调用给定 COM 接口(interface)上的方法?

最佳答案

我引用了 Igor Tandetnik 的回复:

“我已经有一段时间没有使用 MFC 了,所以我的内存很模糊。我认为包装器是从 COleDispatchDriver 派生的,它有一个来自 IDispatch 的构造函数以及 AttachDispatch 方法。使用这些,您可能能够获得原始 IDispatch 指针,将其编码到另一个线程,然后创建一个新的包装器实例并附加指向它的指针。”

基本上,如果你想在编码到另一个线程后使用 COM/ActiveX 对象的 MFC 包装器,你可以使用 COleDispatchDriver 来包装你的 IDispatch 并使用一些宏魔术来调整要调用的代码相同的 InvokeHelper(..) 调用驱动程序对象。或者扩展包装器以使用包括通过驱动程序对编码接口(interface)进行操作,如下面的代码。谢谢,伊戈尔。

void SetCommsWrite(short nAddress, float fValue)
{
static BYTE parms[] = VTS_I2 VTS_R4 ;
InvokeHelper(0x136, DISPATCH_METHOD, VT_EMPTY, NULL, parms, nAddress, fValue);
}
void SetCommsWrite(short nAddress, float fValue, COleDispatchDriver & driver)
{
static BYTE parms[] = VTS_I2 VTS_R4;
driver.InvokeHelper(0x136, DISPATCH_METHOD, VT_EMPTY, NULL, parms, nAddress, fValue);
}

关于c++ - 在没有 Wrapper 类的情况下调用 ActiveX 接口(interface)上的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47475614/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com