Здравствуйте, 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 >>