In our application, we need to use a COM dll (namely msdia100.dll) which was not registered in the system before.
Earler, we have just called the DLL by calling its DllRegisterServer via this code:
// 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);
This doesn't work anymore on Windows 7 (maybe also Vista, didn't tried) because to call this function, it needs Administrator privileges.
All solutions to this problem I have found where about getting those Admin rights. That is no possible solution for us because our application must also work if the user is not able to get those Admin rights.
It is also no solution for us to suddenly need an installer for our application which registeres this DLL.
So, what possibilities are there? How can I use this DLL without Admin rights? Do I have to recode COM which works without the need to register a DLL first?
The code where I uses this lib looks like this:
CComPtr<IDiaDataSource> data_source;
if (FAILED(data_source.CoCreateInstance(CLSID_DiaSource))) {
fprintf(stderr, "CoCreateInstance CLSID_DiaSource failed "
"(msdia80.dll unregistered?)\n");
return false;
}
(Btw., for those who are interested: That is part of Google Breakpad.)