PC Magazin Classic XXL Windows 7.5 (Vorschau)
Erfolgreiche ePaper selbst erstellen
Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.
107<br />
GC.Collect()<br />
Catch ex As Exception<br />
MsgBox(ex.Message, MsgBoxStyle.Criti<br />
cal, „Fehler“)<br />
End Try<br />
End Sub<br />
Damit ist die 64-Bit-Hauptanwendung kodiert,<br />
die ihrerseits die 32-Bit-COM-Klasse mitsamt<br />
den untergeordneten 32-Bit-Steuerelementen<br />
fehlerfrei verwenden kann. Damit Dialoge korrekt<br />
überlagert werden, ist in der COM-Klasse<br />
der Dialog zur Dateiauswahl als oberstes<br />
Fenster definiert (Topmost = True).<br />
Geschwindigkeitsoptimierung<br />
Bleibt abschließend zu betrachten, wie Sie<br />
Systemaufrufe anhand von API-Deklarationen<br />
optimieren. Grundlage dafür sind die mit<br />
<strong>Windows</strong> 7 eingeführten Änderungen in der<br />
System architektur. Im <strong>Windows</strong>-Systemverzeichnis<br />
finden Sie eine Vielzahl neuer DLLs,<br />
die am Präfix API-MS-WIN erkennbar sind.<br />
Die Dateien selbst weisen geringe Größen auf<br />
und exportieren lediglich bereits bekannte<br />
API-Funktionen. Mit dem Dependency Walker<br />
(siehe www.dependencywalker.com) legen<br />
Sie die exportierten API-Funktionen und auch<br />
Abhängigkeiten zwischen Modulen offen.<br />
Starten Sie dazu einfach das Programm und<br />
übernehmen Sie die zu analysierende DLL per<br />
Drag & Drop in das Analyse-Tool. Die Datei<br />
api-mswin-core-file-11-1-0-dll exportiert beispielsweise<br />
die grundlegenden API-Funktionen<br />
zu den Dateioperationen.<br />
Laden Sie aus Vista bekannte DLLs in den Dependency<br />
Walker, dann sehen Sie, dass die<br />
neuen DLLs statisch an die alten System-DLLs<br />
gebunden sind. In diesem Zusammenhang<br />
taucht auch die neue Systemdatei kernelbase.dll<br />
auf. Viele Kernfunktionen haben in älteren<br />
<strong>Windows</strong>-Systemen API-Aufrufe direkt<br />
an ntdll.dll abgesetzt. Unter <strong>Windows</strong> 7 ist<br />
hingegen die neue kernelbase.dll dazwischen<br />
geschaltet. Die DLLs sind leer ohne eigentliche<br />
Funktion. Sie werden nach Bedarf mit geringem<br />
Speicherverbrauch geladen. Während<br />
der API-Aufrufe werden dann die API-Funktionen<br />
durch die tatsächlichen API-Aufrufe ersetzt.<br />
Ziel der Änderungen ist ein schnelleres<br />
Ausführen und Laden von Anwendungen und<br />
deren Bibliotheken, ohne dass das Auswirkungen<br />
auf die API-Funktionen selbst hat. Wie<br />
Sie die ASPI-Funktion wahlweise per Stub File<br />
oder direkt aufrufen, soll an dieser Stelle praktisch<br />
gezeigt werden. Prinzipiell spielt es keine<br />
Rolle, ob Sie DLL-Funktionen wie gewohnt<br />
oder aber über die neuen kompakteren DLLs<br />
und entsprechend angepasste Deklarationsanweisungen<br />
aufrufen. Wie Sie die API-Funktion<br />
deklarieren, zeigen die nachfolgenden<br />
So sieht die Herstellung des COM-Verweises aus<br />
(COM-Klasse und WMI).<br />
Deklarationsanweisungen. Die API-Stub-File-<br />
DLL (Ersatzdatei) ist anders als bei der herkömmlichen<br />
Deklaration nicht mehr direkt an<br />
die Datei kernel32.exe gebunden. Um beide<br />
Deklarationen parallel zu definieren, sind die<br />
Aufrufnamen mit Get <strong>Windows</strong>Directory und<br />
Get<strong>Windows</strong>DirectoryStubFile unterschiedlich<br />
benannt.<br />
‚alte Deklaration:<br />
Declare Function Get<strong>Windows</strong>Directory<br />
Lib „kernel32“<br />
Alias „Get<strong>Windows</strong>DirectoryA“ (ByVal<br />
lpBuffer As String,<br />
ByVal nSize As Integer) As Integer<br />
‘alternative Deklaration über Stub<br />
File:<br />
Declare Function Get<strong>Windows</strong>DirectoryBy<br />
StubFile Lib<br />
„api-ms-win-core-sysinfo-l1-1-0.dll“<br />
Alias<br />
„Get<strong>Windows</strong>DirectoryA“ (ByVal lpBuffer<br />
As String,<br />
ByVal nSize As Integer) As Integer<br />
Die benutzerdefinierte Funktion WinDir ermittelt<br />
korrekten Verzeichnisnamen, wobei<br />
Sie über den Optionalparameter OldCalling<br />
(Standard True) frei festlegen, ob die alte<br />
oder neue Aufrufsyntax verwendet werden<br />
soll. Nutzen Sie die neue Aufrufsyntax (Old-<br />
Calling = False), dann erzielen Sie für Ihre<br />
Anwendung das gleiche Ladeverhalten, das<br />
auch in den System-DLLs selbst zum Einsatz<br />
kommt. Nach außen hin macht es unter <strong>Windows</strong><br />
7 und höher keinen Unterschied, welche<br />
Deklarationsanweisung Sie verwenden.<br />
Da die Umleitung der DLL-Aufrufe allerdings<br />
über Dateien erfolgt, die in älteren <strong>Windows</strong>-<br />
Systemen nicht verfügbar sind, lassen sich so<br />
geänderte Anwendungen auch ausschließlich<br />
unter <strong>Windows</strong> 7 oder höher ausführen, auch<br />
wenn diese Systemfunktionen in den älteren<br />
<strong>Windows</strong>-Systemen dennoch verfügbar sind.<br />
Sie müssen also genau abwägen, unter welchen<br />
Systemen eine Programmausführung<br />
später gewünscht ist. Prinzipiell sollten Sie<br />
aus Kompatibilitätsgründen bevorzugt mit<br />
den bekannten, alten Deklarationen die erforderlichen<br />
API-Aufrufe vornehmen.<br />
Function WinDirectory(Optional OldCal<br />
ling As Boolean = True) As String<br />
Dim Buffer As String = Space(255)<br />
Dim gcLen As Integer = Len(Buffer)<br />
Dim aLen As Integer<br />
If OldCalling Then<br />
aLen = Get<strong>Windows</strong>Directory(Buffer,<br />
gcLen)<br />
Else<br />
aLen = Get<strong>Windows</strong>DirectoryByStubFile<br />
(Buffer, gcLen)<br />
End If<br />
Return Buffer.Substring(0, aLen)<br />
End Function<br />
Wählen Sie im Beispielprogramm die Schaltfläche<br />
ohne Stub Files an, wird das <strong>Windows</strong>-<br />
Verzeichnis in der bewährten Variante ermittelt<br />
und über einen Meldungsdialog angezeigt.<br />
Private Sub btnNormalDeclaration_<br />
Click(…) Handles btnNormalDeclaration.<br />
Click<br />
MsgBox(obj.WinDirectory(), MsgBoxSty<br />
le.Information,<br />
“<strong>Windows</strong>-Verzeichnis (herkömmliche<br />
Deklaration)”)<br />
End Sub<br />
Den Aufruf in der neuen Variante zeigt die Ereignisprozedur,<br />
die nach Anwahl der Schaltfläche<br />
Stub Files ausgeführt wird. In Anwendungen<br />
können Sie die Ausführung später<br />
auch systemspezifisch anhand der abgefragten<br />
Versionsinformationen des Systems<br />
automatisch variieren und entsprechend dem<br />
aktuellen System unterschiedlich abrufen.<br />
Private Sub btnStubFileDeclaration_<br />
Click(..) Handles btnStubFileDeclara<br />
tion.Click<br />
MsgBox(obj.WinDirectory(False), Msg<br />
BoxStyle.Information,<br />
“<strong>Windows</strong>-Verzeichnis (Stub File)”)<br />
End Sub<br />
Damit sind Sie für den Umstieg gewappnet<br />
und portieren Ihre bestehenden 32-Bit-Anwendungen<br />
Schritt für Schritt in die neue,<br />
schöne 64-Bit-Welt.<br />
whs<br />
www.pc-magazin.de <strong>PC</strong> <strong>Magazin</strong> 9/2012