Re[2]: Путь к СОМ Серверу
От: kolam http://www.linkedin.com/in/kolam
Дата: 18.05.03 08:02
Оценка:
Здравствуйте, JS, Вы писали:

JS>У меня есть GUID (или ProgId) СОМ Сервера (не важно какой ДЛЛ или ЕХЕ).

JS>Нужно узнать путь к нему...

1. Для кокласса:
В реестре Windows в разделе HKEY_CLASSES_ROOT\CLSID\{CLSID_кокласса}\LocalServer32 если объект находится внутри EXE-сервера или HKEY_CLASSES_ROOT\CLSID\{CLSID_кокласса}\InprocServer32 если он находится внутри 32-bit DLL-сервера. Открой regedit или OLE/COM Object Viewer (входит в состав Visual Studio) и посмотри. Дополнительную информацию можно получить в MSDN хотя бы статью "OLE Controls: Registration".

2. Для сервера:
HKEY_CLASSES_ROOT\TypeLib\{LIBID_сервера}\[version]\[locale ID]\win32. Здесь [version] версия сервера. Записывается как [verMajor].[verMinor], например "1.0", "2.1" и т.д.; [locale ID] — идентификатор языка, наиболее часто используется "0" — Language Neutral.

Программно на С++ это можно сделать так ( если известна версия и локализация сервера):
ITypeLib *iLib = NULL;

// LIBID_MYSERVER - искомый GUID сервера, его версия = 1.0, локализация = 0
if (FAILED(LoadRegTypeLib(LIBID_MYSERVER, 1, 0, 0, &iLib)))
    return;

ITypeInfo *iInfo = NULL;
int n, iCount = (int) iLib->GetTypeInfoCount();
TYPEATTR *pTypeAttr;
TYPEKIND eKind;

// Ищем первый попавшийся интерфейс
for (n = 0; n < iCount; n++)
{
    if (FAILED(iLib->GetTypeInfo(n, &iInfo)))
        continue;

    if (FAILED(iInfo->GetTypeAttr(&pTypeAttr)))
    {
        iInfo->Release();
        continue;
    }

    eKind = pTypeAttt->typekind;
    iInfo->ReleaseTypeAttr(pTypeAttr);

    if (eKind == TKIND_INTERFACE)
        break;

    iInfo->Release();
    iInfo = NULL;
}

if (!iInfo)
{
    iLib->Release();
    return;
}

BSTR strPath;

if (FAILED(iInfo->GetDllEntry(0, DISPATCH_METHOD, &strPath, NULL, NULL)))
    return;

// Ура, наконец-то получили нужный путь!!!
// ...

SysFreeString(strPath);
iInfo->Release();
iLib->Release();


Но может кто знает как сделать это попроще
... << RSDN@Home 1.0 beta 7a >>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.