题
我试图通过使用下面的代码(DELPHI),以获得全局接口表:
uses Comobj, ActiveX;
var
cGIT : IGlobalInterfaceTable = NIL;
const
CLSID_StdGlobalInterfaceTable: TGUID = '{00000146-0000-0000-C000-000000000046}';
function GIT : IGlobalInterfaceTable;
begin
if (cGIT = NIL) then
OleCheck (CoCreateInstance (CLSID_StdGlobalInterfaceTable, NIL,
CLSCTX_ALL, IGlobalInterfaceTable, cGIT ));
Result := cGIT;
end;
然而,CoCreateInstance的抛出一个“未注册的类”异常。确实:在HKCR / CLSID存在用于{00000146-等}没有条目
哪个DLL或OCX应该注册,以获得在注册表中的这个定义? 还是我这样做完全错了?
解决方案
下面是我的单位,做它。我把这个在一起的时候我在D2006中编译,但我不明白为什么它会在D7任何不同。我将其用于一个接口存储到DCOM服务器和多个线程之间共享。
unit GlobalInterfaceTable;
interface
uses Types,
ActiveX;
type
IGlobalInterfaceTable = interface(IUnknown)
['{00000146-0000-0000-C000-000000000046}']
function RegisterInterfaceInGlobal (pUnk : IUnknown; const riid: TIID; out dwCookie : DWORD): HResult; stdcall;
function RevokeInterfaceFromGlobal (dwCookie: DWORD): HResult; stdcall;
function GetInterfaceFromGlobal (dwCookie: DWORD; const riid: TIID; out ppv): HResult; stdcall;
end;
function GIT: IGlobalInterfaceTable;
implementation
uses ComObj;
const
CLSID_StdGlobalInterfaceTable : TGUID = '{00000323-0000-0000-C000-000000000046}';
function GIT: IGlobalInterfaceTable;
begin
// This function call always returns the singleton instance of the GIT
OleCheck(CoCreateInstance (CLSID_StdGlobalInterfaceTable, NIL, CLSCTX_ALL, IGlobalInterfaceTable, Result));
end;
end.
其他提示
您已定义CLSID_StdGlobalInterfaceTable错误:您所提供的接口的GUID,而不是一个具体的类
我没有Windows的头文件身边,所以我不能对证他们,但搜索表明,它应该是:
CLSID_StdGlobalInterfaceTable: TGUID = '{00000323-0000-0000-C000-000000000046}';
您用过OleView32验证类的GUID?这实用程序可在Windows SDK,让你走的接口注册表注册表编辑器相比要容易得多。我将分类的效用作为必须对任何COM发展。
不隶属于 StackOverflow