Dans notre application, nous devons utiliser une DLL COM (à savoir msdia100.dll) qui n'était pas enregistrée dans le système auparavant.Windows/C++: comment utiliser une DLL COM qui n'est pas enregistrée
earler, nous venons d'appeler la DLL en appelant sa DllRegisterServer via ce 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);
Cela ne fonctionne plus sur Windows 7 (peut-être Vista, n'a pas essayé) car d'appeler cette fonction, il a besoin de privilèges d'administrateur.
Toutes les solutions à ce problème, j'ai trouvé où obtenir ces droits d'administrateur. Ce n'est pas une solution possible pour nous car notre application doit également fonctionner si l'utilisateur n'est pas en mesure d'obtenir ces droits d'administrateur.
Il n'est également pas une solution pour nous d'avoir soudainement besoin d'un programme d'installation pour notre application qui enregistre cette DLL.
Alors, quelles sont les possibilités? Comment puis-je utiliser cette DLL sans droits d'administrateur? Dois-je recoder COM qui fonctionne sans avoir besoin d'enregistrer une DLL en premier?
Le code où j'utilise cette lib ressemble à ceci:
CComPtr<IDiaDataSource> data_source;
if (FAILED(data_source.CoCreateInstance(CLSID_DiaSource))) {
fprintf(stderr, "CoCreateInstance CLSID_DiaSource failed "
"(msdia80.dll unregistered?)\n");
return false;
}
(BTW, pour ceux qui sont intéressés.. Cela fait partie de Google Breakpad)
Ceci est un problème très stupide. Je dois dire, essayer de trouver une solution de contournement pour ce que vous êtes explicitement refusé de faire sans le consentement de votre utilisateur ne prend pas au sérieux les préoccupations de sécurité de votre utilisateur. Ce n'est pas seulement une solution de contournement innocente, c'est le code en cours d'exécution que l'utilisateur n'a aucun moyen de pouvoir deviner. Demandez à votre utilisateur de vous faire confiance d'abord, vous ne vous en approchez pas avec cette approche. –
nobugz: Il n'y a pas de problème de sécurité avec l'exécution d'un objet COM que vous ne pouvez pas obtenir l'autorisation d'enregistrer.L'enregistrement nécessite des droits d'administrateur parce que c'est un état global, et non parce qu'il s'agit d'un problème de sécurité potentiel (comme avec les pilotes de périphériques). Tant que l'objet COM s'exécute en tant qu'utilisateur, il n'est pas différent de s'il faisait partie du fichier EXE. – Gabe
nobugz Je ne suis pas d'accord. Ce n'est pas un problème stupide. Il n'essaie pas de contourner une restriction de sécurité et d'enregistrer la DLL. Il essaie d'utiliser du code dans une DLL COM sans qu'il soit enregistré. Penses-y. Si c'était une DLL normale qui exportait quelques fonctions C, il pouvait appeler ces fonctions. C'est tout ce qu'il veut faire. – richb