5

COMのDllRegisterServerメソッドを実装しようとしています。
だから私はこのチュートリアルを読みました:http:
//www.codeguru.com/cpp/com-tech/activex/tutorials/article.php/c5567/Step-by-Step-COM-Tutorial.htm

そして、DllRegisterServerの一部になるまで手順を実行しました。
これは彼らの実装です:

HRESULT  __stdcall DllRegisterServer(void)
    {
    //
    //As per COM guidelines, every self installable COM inprocess component
    //should export the function DllRegisterServer for printing the 
    //specified information to the registry
    //
    //

    WCHAR *lpwszClsid;
    char szBuff[MAX_PATH]="";
    char szClsid[MAX_PATH]="", szInproc[MAX_PATH]="",szProgId[MAX_PATH];
    char szDescriptionVal[256]="";

    StringFromCLSID(
            CLSID_AddObject,
            &lpwszClsid);

    wsprintf(szClsid,"%S",lpwszClsid);
    wsprintf(szInproc,"%s\\%s\\%s","clsid",szClsid,"InprocServer32");
    wsprintf(szProgId,"%s\\%s\\%s","clsid",szClsid,"ProgId");


    //
    //write the default value 
    //
    wsprintf(szBuff,"%s","Fast Addition Algorithm");
    wsprintf(szDescriptionVal,"%s\\%s","clsid",szClsid);

    HelperWriteKey (
                HKEY_CLASSES_ROOT,
                szDescriptionVal,
                NULL,//write to the "default" value
                REG_SZ,
                (void*)szBuff,
                lstrlen(szBuff)
                );


    //
    //write the "InprocServer32" key data
    //
    GetModuleFileName(
                g_hModule,
                szBuff,
                sizeof(szBuff));
    HelperWriteKey (
                HKEY_CLASSES_ROOT,
                szInproc,
                NULL,//write to the "default" value
                REG_SZ,
                (void*)szBuff,
                lstrlen(szBuff)
                );

    //
    //write the "ProgId" key data under HKCR\clsid\{---}\ProgId
    //
    lstrcpy(szBuff,AddObjProgId);
    HelperWriteKey (
                HKEY_CLASSES_ROOT,
                szProgId,
                NULL,
                REG_SZ,
                (void*)szBuff,
                lstrlen(szBuff)
                );


    //
    //write the "ProgId" data under HKCR\CodeGuru.FastAddition
    //
    wsprintf(szBuff,"%s","Fast Addition Algorithm");
    HelperWriteKey (
                HKEY_CLASSES_ROOT,
                AddObjProgId,
                NULL,
                REG_SZ,
                (void*)szBuff,
                lstrlen(szBuff)
                );


    wsprintf(szProgId,"%s\\%s",AddObjProgId,"CLSID");
    HelperWriteKey (
                HKEY_CLASSES_ROOT,
                szProgId,
                NULL,
                REG_SZ,
                (void*)szClsid,
                lstrlen(szClsid)
                );

    return 1;

    }

ここで、CLSID_AddObjectは次のように定義されます。

// {92E7A9C2-F4CB-11d4-825D-00104B3646C0}
static const GUID CLSID_AddObject = 
{ 0x92e7a9c2, 0xf4cb, 0x11d4, { 0x82, 0x5d, 0x0, 0x10, 0x4b, 0x36, 0x46, 0xc0 } };

StringFromCLSID私が理解していないのは次のとおりです。1。GUIDを文字列として取得するために使用するのはなぜですか。彼らはすでにそれを持っていて、何らかの理由でそれをIIDに変換しますか?IDLファイルで提供するGUIDは十分ではありませんか?
2.どのGUIDを登録する必要がありますか?ライブラリのGUID?インターフェイスのGUID?クラスGUID?またはそれらのすべて?

4

1 に答える 1

1

GUIDが文字列に変換される理由は、GUIDがWindowsレジストリの一部のエントリを形成するために使用されるためです。サンプルコードで、CLSID文字列が、、、およびエントリInprocServer32にどのように組み込まれるかを確認できます。ProgIdCLSID

レジストリにすべてのGUIDを登録する必要があります。COMレジストリキーの詳細については、MSDNのこのページを参照してください。

于 2012-10-30T09:59:03.597 に答える