2010-05-25 2 views
4

Windows 7, C++, VS2008 J'ai une DLL COM qui doit être enregistrée en utilisant "runas administrator" (c'est une application héritée qui écrit dans le registre) La DLL est utilisée par une application de rapports qui l'instancie à l'aide de CoCreateInstance . Cela a échoué sauf si j'ai également exécuté l'application de rapports en tant qu'administrateur; jusqu'à ce que j'ai changé le réglage de l'éditeur de liens de/MANIFESTUAC à/MANIFESTUAC: NONPourquoi/MANIFESTUAC: PAS de travail?

Quelqu'un peut-il me dire pourquoi cela fonctionne? Cela signifie-t-il que je peux écrire des applications qui ignorent l'UAC en utilisant ce paramètre?

Répondre

4

Si votre application d'installation/d'enregistrement a un manifeste et indique «ne pas exécuter d'élévation», lorsque vous essayez d'écrire dans HKLM, cela échoue. Si vous avez un manifeste et qu'il est écrit "run elevated", lorsque vous essayez d'écrire dans HKLM, il réussit. Si vous n'avez pas de manifeste (que vous demandez avec/MANIFESTUAC: NO), lorsque vous essayez d'écrire dans HKLM, il écrit à la place dans un emplacement virtualisé.

Lorsque vous exécutez l'application de rapports, une triple similaire s'applique bien qu'elle puisse lire HKLM. Par conséquent, si l'application de rapports a un manifeste, qu'il soit élevé ou non, il lit HKLM. Sans un manifeste, il lit l'emplacement virtualisé. C'est pourquoi vous avez du succès lorsque les deux applications ont un manifeste ou n'ont pas de manifeste.

Il est préférable d'avoir votre application d'installation avec un manifeste qui demande une élévation, et votre application de rapports a un manifeste qui ne demande pas d'élévation. De cette façon, toutes vos applications disent la vérité et tout fonctionne. De plus, vous savez pourquoi ça se passe.

Questions connexes