В нашем приложении нам нужно использовать COM dll (а именно msdia100.dll), который ранее не был зарегистрирован в системе.
Ранее, мы только что вызвали DLL, вызвав ее DllRegisterServer через этот код:
// Register DIA DLL required by Breakpad
std::string diaLibPath = "msdia100";
HMODULE diaLib = LoadLibrary(diaLibPath.c_str());
if( diaLib == NULL )
{
errors << "Cannot load DLL " << diaLibPath << endl;
return;
}
typedef HRESULT ( __stdcall * regServer_t )(void);
regServer_t regServer = (regServer_t)GetProcAddress(diaLib, "DllRegisterServer");
if( regServer == NULL )
{
errors << "Cannot get method DllRegisterServer from " << diaLibPath << endl;
FreeLibrary(diaLib);
return;
}
if( regServer() != S_OK )
{
errors << "Cannot call DllRegisterServer from " << diaLibPath << endl;
}
FreeLibrary(diaLib);
Это больше не работает в Windows 7 (возможно, также Vista, не пробовал), потому что для вызова этой функции нужны привилегии администратора.
Все решения этой проблемы я нашел где получить права администратора. Это невозможное решение для нас, потому что наше приложение также должно работать, если пользователь не может получить эти права администратора.
Мы также не можем решить, что вдруг понадобится установщик для нашего приложения, который регистрирует эту DLL.
Итак, какие есть возможности? Как я могу использовать эту DLL без прав администратора? Нужно ли перекодировать COM, который работает без необходимости сначала регистрировать DLL?
Код, в котором я использую эту библиотеку, выглядит следующим образом:
CComPtr<IDiaDataSource> data_source;
if (FAILED(data_source.CoCreateInstance(CLSID_DiaSource))) {
fprintf(stderr, "CoCreateInstance CLSID_DiaSource failed "
"(msdia80.dll unregistered?)\n");
return false;
}
(Кстати, для тех, кому интересно: это часть Google Breakpad.)