문제

다음 코드 (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을 잘못 정의했습니다. 콘크리트 클래스가 아닌 인터페이스의 안내를 제공했습니다.

Windows 헤더 파일이 없으므로 확인할 수 없지만 검색은 다음과 같습니다.

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

수업의지도를 확인하기 위해 Oleview32를 사용 했습니까? 이 유틸리티는 Windows SDK에서 제공되며 인터페이스 레지스트리를 Regedit보다 훨씬 쉽게 걸을 수 있습니다. 나는 유틸리티를 COM 개발을 위해 필수로 분류 할 것이다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top