一个COM获取虚拟表指针的问题,我晕菜了,看不懂,用过的朋友指教一个,谢谢

wzswgbx 2018-09-15 10:28:25
LPVOID FAR* ppIface=NULL;


const GUID MyOcxCLSID = {0xB26F6246,0x4C7D,0x11D1,0x91,0x0E,0x00,0x60,0x08,0x07,0x16,0x3F }; //My CLSID:XCDZIP35.OCX
const IID MyOcxFaceID = {0xB26F6244,0x4C7D,0x11D1,0x91,0x0E,0x00,0x60,0x08,0x07,0x16,0x3F };

if (CoInitialize(NULL) != S_OK)
{
printf("Initialize COM library failed!\n");
return 1L;
}

hResult = CoCreateInstance(MyOcxCLSID, NULL,CLSCTX_INPROC_SERVER, IID_IUnknown, (void **)&pUnknown);
if (hResult != S_OK)
{
printf("Create object failed!\n");
return 1L;
}

hResult = pUnknown->QueryInterface(IID_IUnknown, (void **)&ppIface);

if (hResult != S_OK) {
pUnknown->Release();
printf("QueryInterface IDictionary failed!\n");
return 1L;
}

上面的IID_IUnknown指向的不是我的OCX的对象,是系统OLEXXX的,导致我后面ppIface获取的不是我的OCX接口指针,我用MyOcxFaceID代替也没用,我用OLE-VIEW查了一下我的OCX,

// Generated .IDL file (by the OLE/COM Object Viewer)
// typelib filename: XCDZIP35.OCX
[
uuid(B26F6243-4C7D-11D1-910E-00600807163F),
version(2.78),
helpstring("Xceed Zip ActiveX Control")
]
library XCEEDZIPLib
{
// TLib : // TLib : Standard OLE Types : {BEF6E001-A874-101A-8BBA-00AA00300CAB}
importlib("olepro32.dll");
// TLib : OLE Automation : {00020430-0000-0000-C000-000000000046}
importlib("stdole32.tlb");
// Forward declare all types defined in this typelib
dispinterface _DXceedZip;
dispinterface _DXceedZipEvents;

[
uuid(B26F6244-4C7D-11D1-910E-00600807163F),
helpstring("Dispatch interface for the Xceed Zip Control"),
hidden
]
dispinterface _DXceedZip {
properties:
[id(0x00000001)]
VARIANT_BOOL Abort;
[id(0x00000002)]
short Compression;
………………
[id(0x00000026)]
VARIANT_BOOL SfxInstallMode;
[id(0x00000027), hidden]
BSTR InternalState;
methods:
[id(0x00000028), propget]
BSTR SfxPrompts(short SfxPromptID);
[id(0x00000028), propput]
void SfxPrompts(
short SfxPromptID,
BSTR rhs);
………………
[id(0x0000003b)]
void SfxResetDefaultStrings();
[id(0xfffffdd8)]
void AboutBox();
};

[
uuid(B26F6245-4C7D-11D1-910E-00600807163F),
helpstring("Event interface for the Xceed Zip Control")
]
dispinterface _DXceedZipEvents {
properties:
methods:
[id(0x00000001)]
void Adding(
BSTR* FileName,
long Size,
long PSize,
long Processed,
short FileAttr,
BSTR* FTime,
long CRC,
short Ratio,
short Completion,
short Method,
short Encrypted,
short ComLen,
BSTR* Comment);
………………
};

[
uuid(B26F6246-4C7D-11D1-910E-00600807163F),
helpstring("Xceed Zip Control"),
control
]
coclass XceedZip {
[default] dispinterface _DXceedZip;
[default, source] dispinterface _DXceedZipEvents;
};
};

请问一下,这到底怎么回到,我想获取我的OCX的虚拟表
...全文
349 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
wzswgbx 2018-09-21
  • 打赏
  • 举报
回复
因为我不知道这个OCX的接口,只知道CLSID,试了上面uuid都不行,想通知这个
hResult = CoCreateInstance(MyOcxCLSID, NULL,CLSCTX_INPROC_SERVER, IID_IUnknown, (void **)&pUnknown);
来获取
「已注销」 2018-09-18
  • 打赏
  • 举报
回复
hResult = pUnknown->QueryInterface(IID_IUnknown, (void **)&ppIface);
这样查出来难道 ppIface 和 pUnknown 的值不应该时一样的吗?你不是因该查询你自己的接口指针吗:
hResult = pUnknown->QueryInterface(MyOcxFaceID, (void **)&ppIface);

ppIface 的声明也有问题:
LPVOID FAR *ppIface = NULL;
1. 不应该是接口的指针,怎么是 LPVOID 指针呢?不过也不是不行,后面可以强转。
2. 怎么是二级指针,&ppIface 岂不是三级指针了。还是没关系,同样可以强转。
「已注销」 2018-09-17
  • 打赏
  • 举报
回复
为什么两处都不是 MyOcxFaceID
「已注销」 2018-09-17
  • 打赏
  • 举报
回复
为什么两处都是 MyOcxFaceID,不知道你 QueryInterface 的意义何在。
hResult = CoCreateInstance(MyOcxCLSID, NULL,CLSCTX_INPROC_SERVER, IID_IUnknown, (void **)&pUnknown);
hResult = pUnknown->QueryInterface(IID_IUnknown, (void **)&ppIface);
wzswgbx 2018-09-17
  • 打赏
  • 举报
回复
引用 4 楼 SXJIAKE 的回复:
为什么两处都是 MyOcxFaceID,不知道你 QueryInterface 的意义何在。
hResult = CoCreateInstance(MyOcxCLSID, NULL,CLSCTX_INPROC_SERVER, IID_IUnknown, (void **)&pUnknown);
hResult = pUnknown->QueryInterface(IID_IUnknown, (void **)&ppIface);


下面这句是调用之后返回的IID
hResult = CoCreateInstance(MyOcxCLSID, NULL,CLSCTX_INPROC_SERVER, IID_IUnknown, (void **)&pUnknown);

下面这句是利用返回的IID来查询
hResult = pUnknown->QueryInterface(IID_IUnknown, (void **)&ppIface);


请问这错在哪呢
wzswgbx 2018-09-16
  • 打赏
  • 举报
回复
引用 1 楼 jiangsheng 的回复:
看看注册表里对应CLSID下面的类厂信息是不是正确

TypeLib:{B26F6243-4C7D-11D1-910E-00600807163F}
ProgID:XCEEDZIP.XceedZipCtrl.1
这些应该没错
类ID是肯定没错的
路径也正确 C:\Windows\SysWow64\XCDZIP35.OCX


引用 2 楼 worldy 的回复:
使用#import,然后使用智能指针

试过,好像也一样
worldy 2018-09-16
  • 打赏
  • 举报
回复
使用#import,然后使用智能指针
蒋晟 2018-09-16
  • 打赏
  • 举报
回复
看看注册表里对应CLSID下面的类厂信息是不是正确

3,245

社区成员

发帖
与我相关
我的任务
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
  • ATL/ActiveX/COM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧