2012-10-30 2 views
4

COM의 DllRegisterServer 메서드를 구현하려고합니다.
그래서 나는이 튜토리얼을 읽어
http://www.codeguru.com/cpp/com-tech/activex/tutorials/article.php/c5567/Step-by-Step-COM-Tutorial.htmDllRegisterServer 메서드 구현

을 나는의 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 } }; 

내가 이해하지 못하는 것은 : 1. 왜 그들이 문자열로 GUID를 얻을 수 StringFromCLSID을 사용합니까
이 자신의 구현 ? 그들은 이미 그것을 가지고 있으며 어떤 이유로 그들은 그것을 IID로 변환합니까? 우리가 IDL 파일에서 제공하는 GUID가 충분하지 않습니까?
2. 어떤 GUID를 등록해야합니까? Ther 라이브러리의 GUID? 인터페이스의 GUID? 클래스 GUID? 또는 모두?

답변

1

GUID가 문자열로 변환되는 이유는 Windows 레지스트리에 일부 항목을 구성하는 데 사용된다는 것입니다. CLSID 문자열이 InprocServer32, ProgIdCLSID 항목에 어떻게 포함되는지 예제 코드에서 확인할 수 있습니다.

레지스트리에 모든 GUID를 등록해야합니다. COM 레지스트리 키에 대한 자세한 내용은 this page in MSDN을 참조하십시오.

+0

하지만 "{92E7A9C2-F4CB-11d4-825D-00104B3646C0}"을 사용하는 대신 StringFromCLSID를 사용하는 이유는 무엇입니까? – Idov

+0

전용 유형 인'GUID'가 있습니다 (문자열이 아닙니다). 이 유형의 값은 사용자를 위해 생성되며 헤더 파일에서 단일 위치에 정의됩니다. 일반 문자열로 정의 된 동일한 GUID 값은 어디에서 볼 수 있습니까? – Stan

+0

someting_h.h 파일에 그것은 말합니다 : class DECLSPEC_UUID ("some guid") – Idov