2011-01-04 5 views
2

Hier ist das Problem:Gibt es in Visual Studio 2008 ein Makro, das ein 64-Bit-Windows-Betriebssystem identifiziert?

Um die richtige Version von ADO für mein 32-Bit-Programm zu #import, muß ich wissen, ob ich auf einem 32-Bit-Windows-Betriebssystem (dh die Datei im Programm ist bin Kompilieren Dateien) oder ein 64-Bit-Betriebssystem (dh die Datei befindet sich in Programme (x86)). Aber ich kann kein Makro finden, das mir das sagt, oder sogar ein Makro, das mir sagt, dass der Prozessor 64-Bit ist.

Wenn ich testen Sie es auf 64-Bit-Windows-7 Visual Studio 2008 Express ausgeführt wird, werden die folgenden relevanten Makros definiert:

_M_IX86
X86

Aber keiner der * 64 Makros erscheinen definiert werden, was wohl der Fall wäre, wenn sie sich auf/target/architectures beziehen und nicht auf die Architektur der aktuellen Maschine.

Gibt es ein Präprozessor-Makro, das mir sagen wird, ob ich ein 64-Bit-Windows-Betriebssystem ausführen?

Und wenn ja, was ist das? Ich würde mich sogar mit einem zufrieden geben, der mir sagen wird, ob ich einen 64-Bit-Prozessor verwende.

(ps Ich bin bereits bekannt this list)

aktualisieren

Bisher zu denken die Leute scheinen, dass es kein solches Makro ist, und die DLLs kopieren oder Umgebungsvariablen verwendet, ist eine bessere Sache machen.

Also habe ich die Umgebungsvariable Hinweis, habe ich das Problem für Entwickler umgehen, indem Sie beide Ordner - Programmdateien (x86) und Programme - auf den Include-Pfad und mit der Winkel-Klammer-Syntax von #import. Ich vermute jedoch, dass ich Release-Versionen für jede Version des Betriebssystems erstellen muss, da die ADO-DLLs jetzt Teil des Betriebssystems sind und nicht weitervertreibbar sind. Ein Blick darauf.

Antwort

2

Mir ist kein Makro bekannt, aber Sie können die Umgebungsvariable PROCESSOR_ARCHITECTURE verwenden. Beachten Sie, dass Sie in Visual Studio-Einstellungsdialogfeldern mithilfe der $ (PROCESSOR_ARCHITECTURE) -Notation auf Umgebungsvariablen zugreifen können.Eine Problemumgehung für Ihren Fall wäre auch, eine Umgebungsvariable wie ADO_LIB_DIR zu definieren, auf das richtige Programmverzeichnis zu setzen und dann die lib zu importieren oder ein include-Verzeichnis mit einer Notation hinzuzufügen, die $ (ADO_LIB_DIR) verwendet) Variable. Wenn Sie auf einem neuen Computer kompilieren, müssen Sie lediglich die Umgebungsvariable festlegen.

Update: Ich sehe, es gibt auch $ (ProgramFiles) und $ (ProgramFiles (x86)) Umgebungsvariablen, so ist Ihre beste Wette wahrscheinlich, sie zu verwenden.

+0

Obwohl nicht das, was ich gesucht habe, scheint die Verwendung von Umgebungsvariablen in Kombination mit der Winkelsymbol-Syntax von # import das Problem ohne viel Aufwand zu lösen. Ich denke, das ist die beste Alternative, aber ich lasse sie für einen weiteren Tag offen, für den Fall, dass jemand uns etwas Autoritäres geben kann. –

10

für diesen: _WIN64

hier beschrieben:

http://msdn.microsoft.com/en-us/magazine/cc300794.aspx

Ich benutze dies und es funktioniert.

Ihre Situation ist komplexer, da Sie lieber das Betriebssystem als die Art der Kompilierung kennen. Ich benutze Windows x64 die ganze Zeit, aber ich kompiliere sowohl 32-Bit-und 64-Bit-Anwendungen. _WIN64 wird nur definiert, wenn ich eine 64-Bit-Anwendung kompiliere, und nicht, wenn ich eine 32-Bit-Anwendung kompiliere, obwohl ich mich immer auf einem Windows x64-Rechner befinde.

Ich denke, Sie sollten nur Ihre Include-Verzeichnisse anders einrichten, um diese Komplexität zu verbergen. Es ist gut davon auszugehen, dass Include-Verzeichnisse auf verschiedenen Rechnern sehr unterschiedlich sein werden, so dass die Pfaderkennung vollautomatisch versucht, auf lange Sicht zu schlau zu sein.

+0

Ja, wir kompilieren eine 32-Bit-Anwendung, so dass _WIN64 nicht definiert ist. Möglicherweise müssen wir die Include-Verzeichnisse anders einrichten, aber im Moment würde ich gerne wissen, ob es ein Makro gibt, wie das, das ich beschreibe. –

2

Ich hatte das gleiche Problem, aber nicht nur mit ADO, sondern auch mit anderen Bibliotheken (ESRI). So war die Lösung die folgenden: In Einstellung Projekt -> C/C++ -> Preprocessor -> "Preprocessor Definitionen": hinzugefügt folgenden Text: COMPILATION_PLATFORM = $ (PROCESSOR_ARCHITECTURE)

Und in Code, den ich eine Entscheidung treffen kann nur ein Beispiel, wie es funktioniert:

#if ((COMPILATION_PLATFORM == AMD64) && (_WIN64)) 
#pragma message("StdAfx.cpp >> COMPILATION HOST IS RUNNING on WINDOWS64, Generated code = x64 (64bit)") 
#elif ((COMPILATION_PLATFORM == AMD64) && (_WIN32)) 
#pragma message("StdAfx.cpp >> COMPILATION HOST IS RUNNING on WINDOWS64, Generated code = x86 (32bit)") 
#elif ((COMPILATION_PLATFORM == x86) && (_WIN64)) 
#pragma message("StdAfx.cpp >> COMPILATION HOST IS RUNNING on WINDOWS32, Generated code = x64 (64bit)") 
#elif ((COMPILATION_PLATFORM == x86) && (_WIN32)) 
#pragma message("StdAfx.cpp >> COMPILATION HOST IS RUNNING on WINDOWS32, Generated code = x86 (32bit)") 
#endif 

Ich hoffe, es könnte Ihnen helfen. Marek

+0

Cool, danke. Die Umgebungsvariablen waren für mich am einfachsten, aber dies könnte jemand anderem helfen. –

Verwandte Themen