Re: Windows 7 + VirtualStore

28/10/2010 - 11:45 von Peter Mairhofer | Report spam
Hallo Jochen!

Vielen Dank für deine Antwort!

Vorweg mal kurz: Ich habe nun die Öffnung der Datenbank mit
int nRet = sqlite3_open_v2(szFile, &mpDB, SQLITE_OPEN_READONLY, NULL);
vorgenommen, d.h. explizit "read only". Getestet auf einem Windows 7
Rechner wird jetzt keine Datei mehr im VirtualStore angelegt.
Allerdings, wenn die Datei im VirtualStore bereits existiert wird diese
verwendet. Das ist natürlich bei einem Update katastrophal weil da eine
neue Datenbank installiert wird.

Zu deiner Frage: Ich arbeite noch mit VC.Net 2003.

Ich habe jetzt dem Link entsprechend eine Datei mit folgendem Inhalt im
Sourceverzeichnis erstellt:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<ms_asmv2:trustInfo xmlns:ms_asmv2="urn:schemas-microsoft-com:asm.v2">
<ms_asmv2:security>
<ms_asmv2:requestedPrivileges>
<ms_asmv2:requestedExecutionLevel level="asInvoker">
</ms_asmv2:requestedExecutionLevel>
</ms_asmv2:requestedPrivileges>
</ms_asmv2:security>
</ms_asmv2:trustInfo>
</assembly>

Und in die *.rc-Datei eingebunden mit:

#define MANIFEST_RESOURCE_ID 1
MANIFEST_RESOURCE_ID RT_MANIFEST "Testapp.exe.manifest"

Das Manifest erscheint nun im Resourceneditor auf und es müsste auch in
der exe drinnen sein.

Nun hàtte ich folgende Fragen:

1.) Das Format des Manifests ist das richtige oder? In meinem Falle
müsste es zwar egal sein weil ich nicht VC2005 verwende, aber falls ich
mal umsteige habe ich keine Probleme

2.) Das wichtige ist requestedExecutionLevel = asInvoker womit
"Virtualize?" auf "No" gesetzt wird. Der VirtualStore sollte also nicht
mehr verwendet werden. Gilt das auch falls bereits veralterte Dateien im
VirtualStore existieren? Wenn ich beim nàchsten Update die exe mit
Manifest ausliefere sowie eine neue dat-Datei, wird dann garantiert die
neue dat-Datei benutzt?

3.) Ich sollte uiAccess = False setzen; das hat nichts damit zu tun dass
ich Fenster erstelle, ActiveX verwende etc.?

4.) Jetzt könnte ich die Datenbank wieder problemlos mit sqlite3_open
öffnen oder?


LG Peter
 

Lesen sie die antworten

#1 Martin Richter [MVP]
28/10/2010 - 12:15 | Warnen spam
Hallo Peter!

Vorweg mal kurz: Ich habe nun die Öffnung der Datenbank mit
int nRet = sqlite3_open_v2(szFile, &mpDB, SQLITE_OPEN_READONLY, NULL);
vorgenommen, d.h. explizit "read only". Getestet auf einem Windows 7
Rechner wird jetzt keine Datei mehr im VirtualStore angelegt.



Im Virtualstore wird nicht nachgesehen wenn Dein Programm ein Manifest hast!
Die muss klar sein, dass der Virtualstore NUR verwendet wird, wenn kein
Manifest vorhanden ist.

Allerdings, wenn die Datei im VirtualStore bereits existiert wird diese
verwendet. Das ist natürlich bei einem Update katastrophal weil da eine
neue Datenbank installiert wird.



Dein Installer verwendet also auch kein Manifest. Sonst würde dort keine
Datei landen.
Dein Installer benötigt ein RequireAdmin Manifest!

Zu deiner Frage: Ich arbeite noch mit VC.Net 2003.



Dann fügst Du eben die Manifest Ressource selber in Deine RC Datei ein!
Wie Du es ja schon hier machst:

Ich habe jetzt dem Link entsprechend eine Datei mit folgendem Inhalt im
Sourceverzeichnis erstellt:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<ms_asmv2:trustInfo xmlns:ms_asmv2="urn:schemas-microsoft-com:asm.v2">
<ms_asmv2:security>
<ms_asmv2:requestedPrivileges>
<ms_asmv2:requestedExecutionLevel level="asInvoker">
</ms_asmv2:requestedExecutionLevel>
</ms_asmv2:requestedPrivileges>
</ms_asmv2:security>
</ms_asmv2:trustInfo>
</assembly>



Mein Standard Manifest sieht so aus und schließt ComCtl 6.0 ein:
<?xml version='1.0' encoding='UTF-8' standalone='yes'?>
<assembly xmlns='urn:schemas-microsoft-com:asm.v1' manifestVersion='1.0'>
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
<security>
<requestedPrivileges>
<requestedExecutionLevel level='asInvoker' uiAccess='false' />
</requestedPrivileges>
</security>
</trustInfo>
<dependency>
<dependentAssembly>
<assemblyIdentity type='win32'
name='Microsoft.Windows.Common-Controls' version='6.0.0.0'
processorArchitecture='x86' publicKeyToken='6595b64144ccf1df'
language='*' />
</dependentAssembly>
</dependency>
</assembly>


Und in die *.rc-Datei eingebunden mit:

#define MANIFEST_RESOURCE_ID 1
MANIFEST_RESOURCE_ID RT_MANIFEST "Testapp.exe.manifest"



Gut! Aber ist RT_MANIFEST auch als 24 definiert?

Das Manifest erscheint nun im Resourceneditor auf und es müsste auch in
der exe drinnen sein.



Öffne die EXE im VS und schau selber in die Ressourcen
Kontrolle ist besser!

Nun hàtte ich folgende Fragen:

1.) Das Format des Manifests ist das richtige oder? In meinem Falle
müsste es zwar egal sein weil ich nicht VC2005 verwende, aber falls ich
mal umsteige habe ich keine Probleme

2.) Das wichtige ist requestedExecutionLevel = asInvoker womit
"Virtualize?" auf "No" gesetzt wird. Der VirtualStore sollte also nicht
mehr verwendet werden. Gilt das auch falls bereits veralterte Dateien im
VirtualStore existieren? Wenn ich beim nàchsten Update die exe mit
Manifest ausliefere sowie eine neue dat-Datei, wird dann garantiert die
neue dat-Datei benutzt?



Der Virtualstore wird dann nicht mehr verwendet! Gar nicht! Auch nicht
für alte Dateien und "Leichen"
http://blog.m-ri.de/index.php/2007/...tenseiten/

3.) Ich sollte uiAccess = False setzen; das hat nichts damit zu tun dass
ich Fenster erstelle, ActiveX verwende etc.?



Nein! Das sollte immer auf FALSE stehen.

4.) Jetzt könnte ich die Datenbank wieder problemlos mit sqlite3_open
öffnen oder?



Logisch... Bei Nutzung eines UAC-Manifestes wird *keine* Virtualisierung
mehr verwendet!

Martin Richter [MVP] WWJD http://blog.m-ri.de
"A well-written program is its own heaven; a poorly written
program is its own hell!" The Tao of Programming
FAQ: http://www.mpdvc.de Samples: http://www.codeproject.com

Ähnliche fragen