64 bit oder 32 bit auslesen ?
-
Hey,
ich möchte ein programm schreiben das unter 32 und 64 bit unterscheiden kann...
ich bin noch ein anfänger ....
also reichen meine kenntnisse noch nich dafür aus
aber cih hoffe ihr könnt mir helfen
aussehen soll es später undfähr so:
[code]
void main()
{
if(System == 32bit)// ka welche variable ich nachher noch festlege etc
{
.....
}
else
{
.....
}
}fänds nett wenn einer von ecuh wüsste
-
void main()
Lern erstmal die Sprache richtig.
-
ich schreibe hier per Ipod ....
sry kann passiern
-
Scorcher24 schrieb:
void main()
Lern erstmal die Sprache richtig.
wo ist das Problem dabei?
-
http://faq.cprogramming.com/cgi-bin/smartfaq.cgi?id=1043284376&answer=1044841143
http://users.aber.ac.uk/auj/voidmain.shtmlAusserdem muss man ja das "return 0;" gar nicht schreiben am Ende von main().
int main() { runL33tProc(); }
Das ist valide.
-
verstehe da Problem immer noch nicht! - solange er dem Linker mitteil, wo der Programeintrittspunkt ist, ist dich alles OK? Wir reden hier vom Betriebssystem Windows (PE-Format)!?
-
-
@???: Das Problem ist Standard-Konformität - egal ob in C oder C++, du mußt Rükgabetyp int verwenden. Außerdem wird der Rückgabewert der main() ausgewertet und als Error-Code an denjenigen zurückgemeldet, der dein Programm gestartet hat.
Du kannst dir das so vorstellen, daß der Compiler eine weitere Funktion als echten Einstiegspunkt bereitstellt, die etwa so aussieht:__the_real_main() { char ** argv int argc = __parse_command_line(&argv); int result = main(argc,argv); exit(result); }
Sowas kann nur dann gut gehen, wenn die main tatsächlich bereit ist, dir einen Rückgabewert zur Verfügung zu stellen.
If the process is a 64-bit application running under 64-bit Windows, the value is also set to FALSE.
(wobei: Die Frage, ob das Programm als 32- oder 64-Bit übersetzt wurde, müsste der Compiler bereitstellen können)
-
#include <io.h> ... ... BOOL CheckIsOs64Bit(void) { if( _access_s("C:\\Program Files (x86)\\" ,00) ) { return FALSE; } return TRUE; }
-
@Hi: Das ist ja wohl Unfug!
Grund: Weil es auf einem 64bit deutschem XP voll in die Hose geht.
IsWow64Process http://msdn.microsoft.com/en-us/library/ms684139(VS.85).aspx
Ist der einzig richtige Weg.Ein vollständiges Codesample findet sich hier:
http://blogs.msdn.com/b/oldnewthing/archive/2005/02/01/364563.aspx
-
Martin Richter schrieb:
@Hi: Das ist ja wohl Unfug!
Grund: Weil es auf einem 64bit deutschem XP voll in die Hose geht.
Nein! Und das ist getestet!
-
Sorry haste recht!
-
CStoll schrieb:
If the process is a 64-bit application running under 64-bit Windows, the value is also set to FALSE.
(wobei: Die Frage, ob das Programm als 32- oder 64-Bit übersetzt wurde, müsste der Compiler bereitstellen können)
Was willst Du mir damit sagen????
Das ein 64-Bit Prozess zuerst mal selber feststellen muss, ob er auf einem 64-Bit OS läuft!? Denk mal ganz genau über diese Frage nach, dann wirst Du erkennen, das die Antwort auch ohne Aufruf von "IsWow64Process" glasklar ist...
-
Die Frage ist, ob das Programm auf einer 64-Bit-Version von Windows läuft, unabhängig vom Programm selbst.
Die Antwort liefert die Funktion GetNativeSystemInfo.
Diese Funktion gibt es ab Windows 2000. Wenn sie fehlt, kann es also auch kein 64-Bit Windows sein:BOOL Is64BitWindows() { typedef void (WINAPI *PGETNATIVESYSTEMINFO)(LPSYSTEM_INFO); PGETNATIVESYSTEMINFO pGNSI = (PGETNATIVESYSTEMINFO)GetProcAddress( GetModuleHandle(_T("kernel32.dll")), "GetNativeSystemInfo"); if (pGNSI) { SYSTEM_INFO si; pGNSI(&si); switch (si.wProcessorArchitecture) { case PROCESSOR_ARCHITECTURE_AMD64: case PROCESSOR_ARCHITECTURE_IA64: return TRUE; } } return FALSE; }
-
Was soll denn dieser blödsinn?
Die IsWow64Process funktion reicht vollkommen aus (natürlich auch via LoadLibrary/GetProcAddress aufgerufen).Wen nich selber ein 64-Bit Prozess bin, dann brauch ich nicht noch fragen ob ich auf einem 64-Bit OS ausgeführt werde!!! Wenn ich zu dieser Frage hinkomme, dann muss es ja ein 64-Bit Prozesss ein, sonst würde ich ja gar nicht laufen! Oder hast Du schon mal ein 64-Bit Prozess auf einem 32-Bit OS zum laufen bekommen?
-
Ich gehe auch davon aus, dass es ein 32-Bit Programm ist, sonst wäre die ursprüngliche Frage sinnlos.
Der Aufruf von GetNativeSystemInfo liefert genau die gefragte Information.
Die Lösung als "Blödsinn" zu bezeichnen ist unangemessen.Die Frage, ob das Programm im WOW64-Emulator ausgeführt wird, ist nicht gleichbedeutend damit, ob es sich um ein 64-Bit Windows handelt.
Vielleicht wird es später mal einen WOW128 Emulator geben.
-
Jochen Kalmbach schrieb:
CStoll schrieb:
If the process is a 64-bit application running under 64-bit Windows, the value is also set to FALSE.
(wobei: Die Frage, ob das Programm als 32- oder 64-Bit übersetzt wurde, müsste der Compiler bereitstellen können)
Was willst Du mir damit sagen????
Das ein 64-Bit Prozess zuerst mal selber feststellen muss, ob er auf einem 64-Bit OS läuft!? Denk mal ganz genau über diese Frage nach, dann wirst Du erkennen, das die Antwort auch ohne Aufruf von "IsWow64Process" glasklar ist...
Ich wollte darauf hinaus, was das von Martin verlinkte Code-Beispiel erklärt hat - du kannst den selben Quelltext (eventuell mit ein paar Detail-Änderungen) als 32-Bit- oder 64-Bit-Anwendung übersetzen und im letzteren Fall liefert die IsWow64Process false.
-
Wenn man seine App als x64 übersetzt und auf einem x64 OS laufen lässt (auf einem x86 kann man es ja nicht), dann *muss* "IsWow64Process" auch *false* zurückgeben, da der Prozess nicht unter dem "Wow" (Windows (x86) on Windows x64) läuft, sondern als nativer x64 Prozess auf einem x64 OS.
Es ist also _richtig_ das false zurückgeliefert wird.
-
Jochen Kalmbach schrieb:
Wenn man seine App als x64 übersetzt und auf einem x64 OS laufen lässt (auf einem x86 kann man es ja nicht), dann *muss* "IsWow64Process" auch *false* zurückgeben, da der Prozess nicht unter dem "Wow" (Windows (x86) on Windows x64) läuft, sondern als nativer x64 Prozess auf einem x64 OS.
Ja, aus Sicht der Funktion mag das ja stimmen. Die Frage ist nur, ob es das ist, was der Thread-Starter wissen wollte.
-
Dann würde ich aber lieber gar keine Funktion aufrufen, wenn für 64 Bit kompiliert wird. Den Aufwand mit GetNativeSystemInfo würde ich nicht treiben.
BOOL Is64() { #ifdef _WIN64 return TRUE; #else BOOL bIs64 = FALSE; //IsWow64Process is not available on all supported versions of Windows. //Use GetModuleHandle to get a handle to the DLL that contains the function //and GetProcAddress to get a pointer to the function if available. fnIsWow64Process = (LPFN_ISWOW64PROCESS) GetProcAddress( GetModuleHandle(TEXT("kernel32")),"IsWow64Process"); if(NULL != fnIsWow64Process) { if (!fnIsWow64Process(GetCurrentProcess(),&bIs64)) { //handle error } } return bIs64; #endif }