Como obter o GIT em Delphi 7?
-
21-08-2019 - |
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?
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 ??p>
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.