[Win32/C++] manifest files en de VC80 runtime

Pagina: 1
Acties:
  • 155 views sinds 30-01-2008
  • Reageer

  • MisterData
  • Registratie: September 2001
  • Laatst online: 09-04 12:07
Ik heb een programma gemaakt in Visual C++ 2005 en dat werkt allemaal prima. De compiler bakt automatisch een manifest-bestand zodat Windows weet welke runtime het programma (namelijk CRT80) moet gebruiken. Omdat die runtime niet overal geinstalleerd is, wordt die geinstalleerd in mijn installer. Het probleem is dat je daarvoor Administrator-privileges nodig hebt. Omdat mijn programma zelf prima werkt zonder die privileges en ik het programma ook graag wil kunnen installeren als niet-Administrator, vroeg ik me af of het mogelijk was om met zo'n manifest-file (liefst een losse .manifest) zou kunnen aangeven dat de CRT-dll's (msvcrt80.dll, msvcp80.dll, msvcm80.dll) in dezelfde map staan als mijn .exe, en de crt dus niet als side-by-side assembly uit de Windows-map gehaald word?

Ik geloof dat een externe .manifest de manifest-file in een applicatie zelf overruled, dus als ik de .manifest weg haal, moet mijn programma gewoon de CRT uit de Windowsmap gebruiken.

  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 09-04 22:08
Win32/C++, dan gebruik je simpelweg de CRT DLL. Die wordt dan gewoon gevonden door de klassieke Win32 linking rules, net zoals alle andere DLLs, als je geen manifest hebt, of je manifest er niets over zegt. Heb je dat manifest uberhaupt nodig? Zo nee, weggooien en probleem opgelost. Zo ja, edit'm dan en verwijder de CRT80.DLL entry. Uit m'n hoofd is het gewoon XML.

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


Verwijderd

Dat manifest heb je inderdaad nodig (tenzij je de redist voor de crtdll's installeerd op het systeem van de gebruiker).

Je kunt een manifest met de naam Microsoft.VC80.CRT.manifest in de directory (waar je executable in staat) plaatsen met de volgende inhoud:
XML:
1
2
3
4
5
6
7
8
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
    <noInheritable></noInheritable>
    <assemblyIdentity type="win32" name="Microsoft.VC80.CRT" version="8.0.50608.0" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity>
    <file name="msvcr80.dll" hash="2a0d797a8c5eac76e54e98db9682e0938c614b45" hashalg="SHA1"><asmv2:hash xmlns:asmv2="urn:schemas-microsoft-com:asm.v2" xmlns:dsig="http://www.w3.org/2000/09/xmldsig#"><dsig:Transforms><dsig:Transform Algorithm="urn:schemas-microsoft-com:HashTransforms.Identity"></dsig:Transform></dsig:Transforms><dsig:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"></dsig:DigestMethod><dsig:DigestValue>phRUExlAeZ8BwmlD8VlO5udAnRE=</dsig:DigestValue></asmv2:hash></file>
    <file name="msvcp80.dll" hash="cc4ca55fb6aa6b7bb8577ab4b649ab77e42f8f91" hashalg="SHA1"><asmv2:hash xmlns:asmv2="urn:schemas-microsoft-com:asm.v2" xmlns:dsig="http://www.w3.org/2000/09/xmldsig#"><dsig:Transforms><dsig:Transform Algorithm="urn:schemas-microsoft-com:HashTransforms.Identity"></dsig:Transform></dsig:Transforms><dsig:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"></dsig:DigestMethod><dsig:DigestValue>7AY1JqoUvK3u/6bYWbOagGgAFbc=</dsig:DigestValue></asmv2:hash></file>
    <file name="msvcm80.dll" hash="55e8e87bbde00d1d96cc119ccd94e0c02c9a2768" hashalg="SHA1"><asmv2:hash xmlns:asmv2="urn:schemas-microsoft-com:asm.v2" xmlns:dsig="http://www.w3.org/2000/09/xmldsig#"><dsig:Transforms><dsig:Transform Algorithm="urn:schemas-microsoft-com:HashTransforms.Identity"></dsig:Transform></dsig:Transforms><dsig:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"></dsig:DigestMethod><dsig:DigestValue>hWq8zazTsMeKVxWFBa6bnv4hEOw=</dsig:DigestValue></asmv2:hash></file>
</assembly>


Je hoeft misschien niet alle crt dll's er in te zetten of mee te leveren (je gebruikt er als het goed is toch maar een), maar dat heb ik zelf nog niet geprobeerd.

  • MisterData
  • Registratie: September 2001
  • Laatst online: 09-04 12:07
Ja het probleem is dat de compiler heel lastig zonder manifest files werkt. Ik vind het hele idee van side-by-side assemblies mooi en prima, maar het zomaar weghalen van de manifest-dependency in de manifest werkt inderdaad niet. Ik ga het even proberen met de oplossing van Aarbei :)