在没有包装器的情况下调用 ActiveX 界面上的方法 class
Invoking methods on ActiveX interface without a Wrapper class
我正在使用没有源代码的 3d 派对 ActiveX 组件。我可以将组件添加到我的 MFC 对话框中。当我这样做时,会创建一个包装器 class,其中包含许多如下所示的函数:
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 接口。如何在没有包装器的情况下直接调用 COM 接口上的方法?有没有一种简单的方法可以将包装器应用于原始 COM 接口,以便可以重新使用包装器?或者我是否必须使用 IDispatch
接口的 Invoke()
方法?如果是这样,有没有办法找出要调用的真正方法名称字符串是什么?包装器使用上面的 0x109 之类的数字来寻址每个方法。我能否以某种方式利用包装器的 InvokeHelper()
直接调用给定 COM 接口上的方法?
我引用了 Igor Tandetnik 的回复:
"It's been a while since I used MFC, so my recollection is vague. The wrapper, I believe, is derived from COleDispatchDriver
, which has a constructor from IDispatch
as well as AttachDispatch
method. Using these, you might be able to obtain the raw IDispatch
pointer, marshal it to another thread, and there create a new wrapper instance and attach the pointer to it."
基本上,如果您想在编组到另一个线程后将 MFC 包装器用于 COM/ActiveX 对象,您可以使用 COleDispatchDriver
包装您的 IDispatch 并使用一些宏魔术来调整代码以在驱动程序对象上调用相同的 InvokeHelper(..)
调用。或者扩展包装器以使用包括通过驱动程序对编组接口进行操作,如下面的代码。谢谢,伊戈尔。
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);
}
我正在使用没有源代码的 3d 派对 ActiveX 组件。我可以将组件添加到我的 MFC 对话框中。当我这样做时,会创建一个包装器 class,其中包含许多如下所示的函数:
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 接口。如何在没有包装器的情况下直接调用 COM 接口上的方法?有没有一种简单的方法可以将包装器应用于原始 COM 接口,以便可以重新使用包装器?或者我是否必须使用 IDispatch
接口的 Invoke()
方法?如果是这样,有没有办法找出要调用的真正方法名称字符串是什么?包装器使用上面的 0x109 之类的数字来寻址每个方法。我能否以某种方式利用包装器的 InvokeHelper()
直接调用给定 COM 接口上的方法?
我引用了 Igor Tandetnik 的回复:
"It's been a while since I used MFC, so my recollection is vague. The wrapper, I believe, is derived from COleDispatchDriver
, which has a constructor from IDispatch
as well as AttachDispatch
method. Using these, you might be able to obtain the raw IDispatch
pointer, marshal it to another thread, and there create a new wrapper instance and attach the pointer to it."
基本上,如果您想在编组到另一个线程后将 MFC 包装器用于 COM/ActiveX 对象,您可以使用 COleDispatchDriver
包装您的 IDispatch 并使用一些宏魔术来调整代码以在驱动程序对象上调用相同的 InvokeHelper(..)
调用。或者扩展包装器以使用包括通过驱动程序对编组接口进行操作,如下面的代码。谢谢,伊戈尔。
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);
}