質問
私は、次のコード(デルファイ)を使用して、グローバルインターフェイステーブルを取得しようとしている。
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で何が違うのだろう、なぜ私は表示されません。 Iは、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}';
あなたはクラスのGUIDを確認するためにOleView32を使用することがありますか?そのユーティリティは、Windows SDKで利用可能で、あなたはregeditをよりはるかに簡単インターフェースのレジストリを歩くことができます。任意のCOM開発のために持っている必要がありますように私は、ユーティリティを分類する。
所属していません StackOverflow