Сущность технологии COM



Классы и серверы - часть 5


Имея эту таблицу, весьма несложно осуществить реализацию DllRegisterServer:

STDAPI DllRegisterServer(void) { HRESULT hr = S_OK; // look up server's file name // ищем имя файла сервера char szFileName[MAX_PATH]; GetModuleFileNameA(g_hinstDll, szFileName, MAX_PATH); // register entries from table // регистрируем записи из таблицы int nEntries = sizeof(g_RegTable)/sizeof(*g_RegTable); for (int i = 0; SUCCEEDED(hr) && i < nEntries; i++) { const char *pszKeyName = g_RegTable[i][0]; const char *pszValueName = g_RegTable[i][1]; const char *pszvalue = g_RegTable[i][2]; // map rogue value to module file name // переводим нестандарное значение в имя файла модуля if (pszValue == (const char*)-1) pszValue = szFileName; HKEY hkey; // create the key // создаем ключ long err = RegCreateKeyA(HKEY_CLASSES_ROOT, pszKeyName, &hkey); if (err == ERROR_SUCCESS) { // set the value // присваиваем значение err = RegSetValueExA(hkey, pszVvalueName, 0, REG_SZ, (const BYTE*) pszValue, (strlen(pszValue) + 1)); RegCloseKey(hkey); } if (err != ERROR_SUCCESS) { // if cannot add key or value, back out and fail // если невозможно добавить ключ или значение, то откат и сбой DllUnregisterServer(); hr = SELFREG_E_CLASS; } } return hr; }

Соответствующая DllUnregisterServer будет выглядеть так:

STDAPI DllUnregisterServer(void) { HRESULT hr = S_OK; int nEntries = sizeof(g_RegTable)/sizeof(*g_RegTable); for (int i = nEntries - 1; i >= 0; i--) { const char *pszKeyName = g_RegTable[i][0]; long err = RegDeleteKeyA(HKEY_CLASSES_ROOT, pszKeyName); if (err != ERROR_SUCCESS) hr = S_FALSE; } return hr; }

Отметим, что реализация DllUnregisterServer просматривает таблицу с конца, начиная с последней входной точки. Делается это для преодоления ограничения RegDeleteKey, в котором разрешаются только такие ключи, у которых нет подключей, подлежащих удалению. Реализация DllUnregisterServer требует такой организации таблицы, чтобы все подключи каждого ключа появлялись в таблице после входа родительского ключа.




Содержание  Назад  Вперед