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的虛擬表
uj5u.com熱心網友回復:
看看注冊表里對應CLSID下面的類廠資訊是不是正確uj5u.com熱心網友回復:
使用#import,然后使用智能指標uj5u.com熱心網友回復:
TypeLib:{B26F6243-4C7D-11D1-910E-00600807163F}
ProgID:XCEEDZIP.XceedZipCtrl.1
這些應該沒錯
類ID是肯定沒錯的
路徑也正確 C:\Windows\SysWow64\XCDZIP35.OCX
試過,好像也一樣
uj5u.com熱心網友回復:
為什么兩處都是 MyOcxFaceID,不知道你 QueryInterface 的意義何在。hResult = CoCreateInstance(MyOcxCLSID, NULL,CLSCTX_INPROC_SERVER, IID_IUnknown, (void **)&pUnknown);
hResult = pUnknown->QueryInterface(IID_IUnknown, (void **)&ppIface);
uj5u.com熱心網友回復:
為什么兩處都不是 MyOcxFaceIDuj5u.com熱心網友回復:
下面這句是呼叫之后回傳的IID
hResult = CoCreateInstance(MyOcxCLSID, NULL,CLSCTX_INPROC_SERVER, IID_IUnknown, (void **)&pUnknown);
下面這句是利用回傳的IID來查詢
hResult = pUnknown->QueryInterface(IID_IUnknown, (void **)&ppIface);
請問這錯在哪呢
uj5u.com熱心網友回復:
hResult = pUnknown->QueryInterface(IID_IUnknown, (void **)&ppIface);這樣查出來難道 ppIface 和 pUnknown 的值不應該時一樣的嗎?你不是因該查詢你自己的介面指標嗎:
hResult = pUnknown->QueryInterface(MyOcxFaceID, (void **)&ppIface);
ppIface 的宣告也有問題:
LPVOID FAR *ppIface = NULL;
1. 不應該是介面的指標,怎么是 LPVOID 指標呢?不過也不是不行,后面可以強轉。
2. 怎么是二級指標,&ppIface 豈不是三級指標了。還是沒關系,同樣可以強轉。
uj5u.com熱心網友回復:
因為我不知道這個OCX的介面,只知道CLSID,試了上面uuid都不行,想通知這個hResult = CoCreateInstance(MyOcxCLSID, NULL,CLSCTX_INPROC_SERVER, IID_IUnknown, (void **)&pUnknown);
來獲取
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/62512.html
