27.02.2014 Aufrufe

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

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!