Pergunta

Eu estou tentando obter a tabela de interface global, usando o código a seguir (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;

No entanto, CoCreateInstance lança uma exceção de "Classe não registrada". E, de fato:. Em HKCR / CLSID não há nenhuma entrada para {00000146- etc.}

Qual DLL ou OCX deve ser registrado, para obter essa definição no registro? Ou eu estou fazendo isso totalmente errado?

Foi útil?

Solução

Aqui está a minha unidade que faz isso. Eu coloquei isso juntos quando eu estava compilando em D2006, mas eu não vejo por que seria diferente no D7. Eu usá-lo para armazenar uma interface para um servidor DCOM e compartilhá-lo entre vários segmentos.

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.

Outras dicas

Você definiu CLSID_StdGlobalInterfaceTable incorretamente:. Você tiver fornecido o GUID da interface em vez de uma classe concreta

Eu não tenho os arquivos de cabeçalho do Windows ao redor, por isso não posso verificar contra eles, mas uma pesquisa sugere que deve ser:

 CLSID_StdGlobalInterfaceTable: TGUID = '{00000323-0000-0000-C000-000000000046}';

Você usou OleView32 para verificar o GUID da classe? Esse utilitário está disponível no SDK do Windows e permite que você ande o registro de interfaces muito mais fácil do regedit. Eu classificaria a utilidade como um deve ter para qualquer desenvolvimento COM.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top