2009-08-22 7 views
1

Ich weiß, der Titel macht wenig Sinn, vor allem, weil es schwer ist, in nur einer Zeile zu erklären. So, hier ist die Situation:Überprüfen, ob DWM/Aero aktiviert ist und diesen Code in der gleichen Binärdatei für 2000/XP/Vista/7 hat

Ich habe ein Programm, das binäre richtet sich an Windows 2000 und neuer. Jetzt ging ich voran und fügte Code hinzu, um zu überprüfen, ob der Benutzer unter Vista/7 läuft, und wenn ja, dann überprüfe, ob Aero/DWM aktiviert ist. Auf dieser Grundlage werde ich einige Dinge deaktivieren, die für die jeweilige Plattform nicht relevant sind, und einige andere Funktionen aktivieren. Mein Hauptproblem ist, dass ich DwmIsCompositionEnabled von Visual C++ 2008 aufrufen muss, muss ich die Datei dwmapi.lib hinzufügen und kompilieren dagegen. Wenn Sie die Binärdatei in einem anderen als Vista oder 7 ausführen, wird die Fehlermeldung "Die Komponente kann nicht gefunden werden. Die Anwendung konnte nicht gestartet werden, da dwmapi.dll nicht gefunden wurde" angezeigt. Dies wird natürlich erwartet, da DWM neu und für ältere Plattformen nicht verfügbar ist.

Meine Frage ist dann: wird es mir irgendwie gelingen, das durchzuziehen? Eine Binärdatei für alle Betriebssystemversionen UND enthält diesen DWM-Prüfcode? Dieses Programm wurde unter Visual Studio 2008, Visual C++ mit MFC geschrieben.

+1

Während ich es selbst nie getan habe, ist es möglich, Windows auf eine andere binäre eingebettet innerhalb der Haupt unter bestimmten Bedingung (am häufigsten ist eine vereinheitlichte 32bit/64bit binary, Process Explorer verwendet, um zu laufen) zu bekommen im 64-Bit-Modus von einer 32-Bit-Binärdatei zum Beispiel). – ewanm89

+0

Microsoft scheint diese Technik Side-by-Side-Assemblies zu nennen und ist auf MSDN http://msdn.microsoft.com/en-us/library/ms235531.aspx dokumentiert, obwohl die meisten Dokumente, die ich zu finden scheint, speziell erscheinen Verwenden Sie es zum Erstellen von DLLs, die mehrere Bibliotheksversionen einkapseln. – ewanm89

+0

Danke für die Kommentare. Du hast mich gleich zur richtigen Antwort geführt. – enriquein

Antwort

2

Es stellt sich heraus, ich kann nur den Linker zu verzögern, laden Sie die dwmapi.dll.

Ich möchte ewanm89 danken, weil etwas, das er gesagt hat, irgendwie Resonanz gefunden hat und mich auf den Weg führte, um die tatsächliche Antwort zu finden.

+1

Ja, als ich geschlafen habe, fragte ich mich, ob Sie nur die DLL auf den Zustand laden können und keine zweite Binärdatei brauchen ... – ewanm89

+1

Wie Sie geschlafen haben! Beeindruckend. –

1

Die normale Lösung ist, LoadLibrary() und GetProcAddress() zu verwenden. Beide können nach dem Start Ihres Programms durchgeführt werden. Aber immer noch +1 für die DelayLoad-Lösung, die hinter den Kulissen für Sie dasselbe tut.