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? 또는 모두?
하지만 "{92E7A9C2-F4CB-11d4-825D-00104B3646C0}"을 사용하는 대신 StringFromCLSID를 사용하는 이유는 무엇입니까? – Idov
전용 유형 인'GUID'가 있습니다 (문자열이 아닙니다). 이 유형의 값은 사용자를 위해 생성되며 헤더 파일에서 단일 위치에 정의됩니다. 일반 문자열로 정의 된 동일한 GUID 값은 어디에서 볼 수 있습니까? – Stan
someting_h.h 파일에 그것은 말합니다 : class DECLSPEC_UUID ("some guid") – Idov