实施dllRegisterserver方法

Implementing the DllRegisterServer method

本文关键字:方法 dllRegisterserver 实施      更新时间:2023-10-16

我正在尝试实现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 HKCRclsid{---}ProgId
    //
    lstrcpy(szBuff,AddObjProgId);
    HelperWriteKey (
                HKEY_CLASSES_ROOT,
                szProgId,
                NULL,
                REG_SZ,
                (void*)szBuff,
                lstrlen(szBuff)
                );

    //
    //write the "ProgId" data under HKCRCodeGuru.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 } };

我不明白的是: 1.为什么他们使用StringFromCLSID将GUID作为字符串获取?他们已经有了它,由于某种原因,他们将其转换为IID?我们在IDL文件中提供的GUID是否足够好?
2.需要注册哪些GUID?图书馆的指导?接口的指导?班级指南?或所有这些?

将GUID转换为字符串的原因是它用于在Windows注册表中形成一些条目。您可能会在示例代码中看到CLSID字符串如何合并到InprocServer32ProgIdCLSID条目中。

您应该在注册表中注册所有GUID。您可能会在MSDN中查看此页面以获取有关COM注册表键的详细信息。