如何通过 CreateInstanceLic 获得许可的 COM 对象?
How to get licensed COM object via CreateInstanceLic?
我正在尝试访问许可服务器的 com,所以我正在使用 IClassFactory2 来做
所以。到目前为止,这是我的代码:
// ...
IClassFactory2 class_factory;
hr = CoGetClassObject(
&clsid,
CLSCTX_LOCAL_SERVER,
NULL,
&IID_IClassFactory2,
(LPVOID*) &class_factory
);
if (hr != S_OK) { return 1; }
// ...
hr = class_factory.lpVtbl->CreateInstanceLic(
&class_factory,
NULL,
NULL,
&IID_IDispatch,
key,
(LPVOID)&dispatch
);
// ...
但是,对 CreateInstanceLic
的调用会出现段错误。
Exception thrown at 0x00000001 in consoleapplication1.exe: 0xC0000005: Access violation reading location 0x00000001.
我认为原因是 class_factory.lpVtbl
看起来像这样:
QueryInterface oleaut32.dll!0x75769edc (Type information missing from symbol file) HRESULT(__stdcall*)(IClassFactory2 *, const _GUID * const, void * *)
AddRef 0x00000001 unsigned long(__stdcall*)(IClassFactory2 *)
Release 0x00401074 unsigned long(__stdcall*)(IClassFactory2 *)
CreateInstance 0x003f67a0 HRESULT(__stdcall*)(IClassFactory2 *, IUnknown *, const _GUID * const, void * *)
LockServer 0x003e777c HRESULT(__stdcall*)(IClassFactory2 *, int)
GetLicInfo 0x003e7778 HRESULT(__stdcall*)(IClassFactory2 *, tagLICINFO *)
RequestLicKey 0x757e60c4 {oleaut32.dll!_gPFactory} HRESULT(__stdcall*)(IClassFactory2 *, unsigned long, wchar_t * *)
CreateInstanceLic 0x00000001 HRESULT(__stdcall*)(IClassFactory2 *, IUnknown *, IUnknown *, const _GUID * const, wchar_t *, void * *)
我觉得 0x00000001 不是 CreateInstanceLic
应该位于的有效地址。所以我可能做错了什么,但不知道是什么。
所以应该是:
IClassFactory2 * class_factory;
hr = CoGetClassObject(
&clsid,
CLSCTX_LOCAL_SERVER,
NULL,
&IID_IClassFactory2,
&class_factory
);
if (hr != S_OK) { return 1; }
// ...
IDispatch * dispatch;
hr = class_factory.lpVtbl->CreateInstanceLic(
&class_factory,
NULL,
NULL,
&IID_IDispatch,
key,
&dispatch
);
我正在尝试访问许可服务器的 com,所以我正在使用 IClassFactory2 来做 所以。到目前为止,这是我的代码:
// ...
IClassFactory2 class_factory;
hr = CoGetClassObject(
&clsid,
CLSCTX_LOCAL_SERVER,
NULL,
&IID_IClassFactory2,
(LPVOID*) &class_factory
);
if (hr != S_OK) { return 1; }
// ...
hr = class_factory.lpVtbl->CreateInstanceLic(
&class_factory,
NULL,
NULL,
&IID_IDispatch,
key,
(LPVOID)&dispatch
);
// ...
但是,对 CreateInstanceLic
的调用会出现段错误。
Exception thrown at 0x00000001 in consoleapplication1.exe: 0xC0000005: Access violation reading location 0x00000001.
我认为原因是 class_factory.lpVtbl
看起来像这样:
QueryInterface oleaut32.dll!0x75769edc (Type information missing from symbol file) HRESULT(__stdcall*)(IClassFactory2 *, const _GUID * const, void * *)
AddRef 0x00000001 unsigned long(__stdcall*)(IClassFactory2 *)
Release 0x00401074 unsigned long(__stdcall*)(IClassFactory2 *)
CreateInstance 0x003f67a0 HRESULT(__stdcall*)(IClassFactory2 *, IUnknown *, const _GUID * const, void * *)
LockServer 0x003e777c HRESULT(__stdcall*)(IClassFactory2 *, int)
GetLicInfo 0x003e7778 HRESULT(__stdcall*)(IClassFactory2 *, tagLICINFO *)
RequestLicKey 0x757e60c4 {oleaut32.dll!_gPFactory} HRESULT(__stdcall*)(IClassFactory2 *, unsigned long, wchar_t * *)
CreateInstanceLic 0x00000001 HRESULT(__stdcall*)(IClassFactory2 *, IUnknown *, IUnknown *, const _GUID * const, wchar_t *, void * *)
我觉得 0x00000001 不是 CreateInstanceLic
应该位于的有效地址。所以我可能做错了什么,但不知道是什么。
所以应该是:
IClassFactory2 * class_factory;
hr = CoGetClassObject(
&clsid,
CLSCTX_LOCAL_SERVER,
NULL,
&IID_IClassFactory2,
&class_factory
);
if (hr != S_OK) { return 1; }
// ...
IDispatch * dispatch;
hr = class_factory.lpVtbl->CreateInstanceLic(
&class_factory,
NULL,
NULL,
&IID_IDispatch,
key,
&dispatch
);