سؤال

وأنا أحاول الحصول على جدول الواجهة العمومية باستخدام التعليمات البرمجية التالية (دلفي):

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 من الصف؟ أن تتوفر الأداة المساعدة في SDK ويندوز ويسمح لك السير في التسجيل من واجهات أسهل بكثير من regedit ثم. وأود أن تصنيف الأداة المساعدة كما يجب أن يكون لأية تنمية COM.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top