Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Kajjin112 en 24 Junio 2013, 04:46 am



Título: Como comprobar si Windows es de 32 o 64 bits en C++?
Publicado por: Kajjin112 en 24 Junio 2013, 04:46 am
Hola a todos, estoy creando una pequña aplicacion para ejecutar secuencialmente una serie de programas para llevar a cabo un mantenimiento completo del sistema. En esa aplicacion incluyo programas para actualizar software, optimizar y borrar lo innecesario, entre otras cosas.
La cosa es que cuando tengo que ejecutar CCleaner desde mi aplicacion, tengo que elegir entre ejecutar CCleaner.exe o CClener64.exe dependiendo de la arquitectura de Windows. Yo lo que quiero hacer es, luego de la funcion main, es declarar una variable con if (creo), para asignarle a la variable SO alguno de estos dos valores: x32 y x64.
Para determinar si el Sistema Operativo es x32 o x64, habia pensado en comprobar la existencia de la carpeta "C:\Program Files (x86)". En otras palabras, seria algo asi:

Código:
int main(){
    int SO
    if exist "%systemdrive%\Program Files (x86)"{
             SO == x64}
             else{
                   SO == x32}
Entonces la variable SO quedaria con un valor de x32 o x64. Despues, a la hora de ejecutar CCleaner, el codigo seria algo asi:

Código:
while(SO == x64){
                system("CCleaner64.exe");
                 }
                 else{
                        system("CCleaner.exe");

Coloquialmente seria:
"Si existe la carpeta '%systemdrive%/Program Files (x86)' el sistema operativo es x64, sino, es x32. Siempre que el sistema operativo sea x64, ejecutar 'CCleaner64.exe', sino, ejecutar 'CCleaner.exe'"

Como pueden ver soy nuevo en esto de la programacion en C++. Anteriormente hice algunos archivos en batch, por eso algunos de los comandos que utilizo son de batch (como el if exist o la variable %systemdrive%), porque no se como serian en C++.
Espero que hayan entendido mi duda y puedan ayudarme, gracias de antemano.


Título: Re: Como comprobar si Windows es de 32 o 64 bits en C++?
Publicado por: ecfisa en 24 Junio 2013, 05:07 am
Hola Kajjin112.

Podes utilizar la función: IsWow64Process (http://msdn.microsoft.com/en-us/library/windows/desktop/ms684139%28v=vs.85%29.aspx)

Saludos :)


Título: Re: Como comprobar si Windows es de 32 o 64 bits en C++?
Publicado por: ThePinkPanther en 24 Junio 2013, 06:26 am
Dudo que exista el if exists , eso es batch.  :-\


Título: Re: Como comprobar si Windows es de 32 o 64 bits en C++?
Publicado por: amchacon en 24 Junio 2013, 11:57 am
Sencillo, haz una versión en 64 bits y otra en 32 bits.


Título: Re: Como comprobar si Windows es de 32 o 64 bits en C++?
Publicado por: Kajjin112 en 24 Junio 2013, 17:21 pm
Hola Kajjin112.

Podes utilizar la función: IsWow64Process (http://msdn.microsoft.com/en-us/library/windows/desktop/ms684139%28v=vs.85%29.aspx)

Saludos :)
Esa funcion es para saber si un determinado proceso esta ejecutandose bajo WOW64 o no. Lo que yo quiero es comprobar la existencia de una carpeta predefinida en el codigo fuente del programa, para hacer UN SOLO programa.
Tienen idea de que funcion puedo usar? (Sé que if exist es batch, lo que yo estoy buscando seria algo asi como el equivalente de if exist en c++)


Título: Re: Como comprobar si Windows es de 32 o 64 bits en C++?
Publicado por: maxim_o en 24 Junio 2013, 17:43 pm
Creo que es esto lo que quieres:
http://foro.elhacker.net/programacion_cc/c_comprobar_si_existe_carpeta_elsecrear_carpetas-t112877.0.html


Título: Re: Como comprobar si Windows es de 32 o 64 bits en C++?
Publicado por: daryo en 24 Junio 2013, 18:00 pm
.


Título: Re: Como comprobar si Windows es de 32 o 64 bits en C++?
Publicado por: Khronos14 en 24 Junio 2013, 18:06 pm
Puedes probar con directivas condicionales del compilador, si utilizas el Visual Studio es muy sencillo, existen los defines: _WIN32 y _WIN64.

Te pongo un ejemplo:

Código
  1. #ifdef _WIN64
  2. printf("WIN64\n");
  3. #else
  4. printf("WIN32\n");
  5. #endif
  6.  

Pero si usas GCC tienes que utilizar sus macros específicas:

http://stackoverflow.com/questions/1505582/determining-32-vs-64-bit-in-c

Saludos.


Título: Re: Como comprobar si Windows es de 32 o 64 bits en C++?
Publicado por: daryo en 24 Junio 2013, 18:16 pm
.


Título: Re: Como comprobar si Windows es de 32 o 64 bits en C++?
Publicado por: x64core en 24 Junio 2013, 20:08 pm
*FACEPALM* Santa mier* chicos por favor diganme que eso de usar macros del preprocesador solo
lo dicen como trolls... Ya dieron la respuesta a la pregunta, se puede utilizar IsWow64Process para saber si un proceso
esta siendo ejecuta como un WoW64, si lo es, entonces estamos en un Windows de 64 bits, sino, es de 32bits.

Esto no es de si queremos compilar un PE32 o PE32+


Título: Re: Como comprobar si Windows es de 32 o 64 bits en C++?
Publicado por: Khronos14 en 24 Junio 2013, 23:04 pm
*FACEPALM* Santa mier* chicos por favor diganme que eso de usar macros del preprocesador solo
lo dicen como trolls... Ya dieron la respuesta a la pregunta, se puede utilizar IsWow64Process para saber si un proceso
esta siendo ejecuta como un WoW64, si lo es, entonces estamos en un Windows de 64 bits, sino, es de 32bits.

Esto no es de si queremos compilar un PE32 o PE32+

Jajajaja leí rápido la pregunta y ni me di cuenta de lo que escribía.

Saludos.


Título: Re: Como comprobar si Windows es de 32 o 64 bits en C++?
Publicado por: pacoperico en 24 Junio 2013, 23:22 pm
Lo que yo quiero es comprobar la existencia de una carpeta predefinida en el codigo fuente del programa, para hacer UN SOLO programa.

Creo que lo que pretendes es averiguar el tipo de sistema operativo a traves del nombre de una carpeta, en ese extraño caso aqui tienes un buen ejemplo:

http://msdn.microsoft.com/en-us/library/ms724426(v=vs.85).aspx (http://msdn.microsoft.com/en-us/library/ms724426(v=vs.85).aspx)

Si lo que quieres es saber el sistema operativo que se esta ejecutando prueba con esta funcion:

http://msdn.microsoft.com/en-us/library/ms724451(v=vs.85).aspx (http://msdn.microsoft.com/en-us/library/ms724451(v=vs.85).aspx)


Título: Re: Como comprobar si Windows es de 32 o 64 bits en C++?
Publicado por: x64core en 25 Junio 2013, 08:37 am
Creo que lo que pretendes es averiguar el tipo de sistema operativo a traves del nombre de una carpeta, en ese extraño caso aqui tienes un buen ejemplo:

http://msdn.microsoft.com/en-us/library/ms724426(v=vs.85).aspx (http://msdn.microsoft.com/en-us/library/ms724426(v=vs.85).aspx)

Si lo que quieres es saber el sistema operativo que se esta ejecutando prueba con esta funcion:

http://msdn.microsoft.com/en-us/library/ms724451(v=vs.85).aspx (http://msdn.microsoft.com/en-us/library/ms724451(v=vs.85).aspx)

Innecesario para eso hay APIs para que recuperan el path correcto.
Averiguar la version usando por ejemplo un directorio como "Program Files (x86)" no te asegura nada, yo puedo tener un Windows de 32bits
y puedo crear el directorio "Program Files (x86)" y como resultado indicaria que estoy en uno de 64-bits lo cual es incorrecto.
La respuesta es IsWow64Process


Título: Re: Como comprobar si Windows es de 32 o 64 bits en C++?
Publicado por: pacoperico en 25 Junio 2013, 16:33 pm
Innecesario para eso hay APIs para que recuperan el path correcto.
Averiguar la version usando por ejemplo un directorio como "Program Files (x86)" no te asegura nada, yo puedo tener un Windows de 32bits
y puedo crear el directorio "Program Files (x86)" y como resultado indicaria que estoy en uno de 64-bits lo cual es incorrecto.
La respuesta es IsWow64Process

Si lo que se busca es saber si estamos en 32 o 64 bits pues con iswow64 es suficiente para ese proposito. Por el anterior mensaje del autor del post decia que iswow64 no le servia  :huh: asi que deberia explicar mejor que es lo que esta buscando.


Título: Re: Como comprobar si Windows es de 32 o 64 bits en C++?
Publicado por: Kajjin112 en 25 Junio 2013, 19:04 pm
Hola a todos. Les comento que pude lograr lo que queria, es decir, comprobar la existencia de una carpeta definida en el codigo fuente y si existe, darle a la variable SO un valor de x64. En lugar de hacerlo con Program Files (x86) lo hice con SysWOW64. El codigo quedo así:

Código:
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <windows.h>

using namespace std;

int main(){
//Identificar Sistema Operativo
int SO, x64, x32;
if (GetFileAttributes("%windir%\\SysWOW64")==1){
SO==x64;
}else{
SO==x32;
}

Y a la hora de que el programa decida si abrir CCleaner x32 o x64 el codigo es asi:

      
Código:
if(SO==x64){
system("archivos\\CCleaner\\CCleaner64.exe");
}else{
system("archivos\\CCleaner\\CCleaner.exe");
      
Como bien dijo x64Core, esa carpeta puede crearse y hacer que el programa falle. A mi parecer la funcion IsWow64 no me sirve para este caso, porque según entendí, esa funcion lo que hace es identificar si un proceso que esta ejecutandose es de 32 o 64 bits, no si se debe ejecutar un .exe de 32 o 64 bits depende el sistema operativo, o me equivoco?


Título: Re: Como comprobar si Windows es de 32 o 64 bits en C++?
Publicado por: x64core en 25 Junio 2013, 20:52 pm
Hola a todos. Les comento que pude lograr lo que queria, es decir, comprobar la existencia de una carpeta definida en el codigo fuente y si existe, darle a la variable SO un valor de x64. En lugar de hacerlo con Program Files (x86) lo hice con SysWOW64. El codigo quedo así:

Código:
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <windows.h>

using namespace std;

int main(){
//Identificar Sistema Operativo
int SO, x64, x32;
if (GetFileAttributes("%windir%\\SysWOW64")==1){
SO==x64;
}else{
SO==x32;
}

Y a la hora de que el programa decida si abrir CCleaner x32 o x64 el codigo es asi:

      
Código:
if(SO==x64){
system("archivos\\CCleaner\\CCleaner64.exe");
}else{
system("archivos\\CCleaner\\CCleaner.exe");
      
Como bien dijo x64Core, esa carpeta puede crearse y hacer que el programa falle. A mi parecer la funcion IsWow64 no me sirve para este caso, porque según entendí, esa funcion lo que hace es identificar si un proceso que esta ejecutandose es de 32 o 64 bits, no si se debe ejecutar un .exe de 32 o 64 bits depende el sistema operativo, o me equivoco?

IsWow64Process indicara si el proceso se esta ejecutando como WoW64, es como se ejecutan los procesos de 32bits en Window de 64-bits

Código:
r = IsWow64Process(-1,&OS)
if(r)
{
   if(OS)
   {
      // Windows de 64-bits
   }
   else
   {
      // Windows de 32-bits
   }
}





Título: Re: Como comprobar si Windows es de 32 o 64 bits en C++?
Publicado por: Kajjin112 en 26 Junio 2013, 04:46 am
Claro, pero este archivo que estoy programando se ejecuta en 32 bits. Entonces, podemos ejecutar este archivo en sistemas windows 32 y 64 bits. Lo que se ejecuta en 64 bits si el SO es compatible es el CCleaner, por eso CREO que IsWow64 no me sirve para elegir si ejecutar el archivo x64 o el x86 dependiendo de la arquitectura del SO


Título: Re: Como comprobar si Windows es de 32 o 64 bits en C++?
Publicado por: x64core en 26 Junio 2013, 07:19 am
Claro, pero este archivo que estoy programando se ejecuta en 32 bits. Entonces, podemos ejecutar este archivo en sistemas windows 32 y 64 bits. Lo que se ejecuta en 64 bits si el SO es compatible es el CCleaner, por eso CREO que IsWow64 no me sirve para elegir si ejecutar el archivo x64 o el x86 dependiendo de la arquitectura del SO
No entendi por la forma en que escribes, de todos modos programados compilados en 32-bits se pueden
ejecutar tanto en Windows de 32 y 64 (WOW64) .


Título: Re: Como comprobar si Windows es de 32 o 64 bits en C++?
Publicado por: Kajjin112 en 27 Junio 2013, 02:36 am
Así es. Mi problema se solucionó, y gracias a todos por la ayuda. Saludos.


Título: Re: Como comprobar si Windows es de 32 o 64 bits en C++?
Publicado por: OmarHack en 27 Junio 2013, 03:31 am
El ccleaner de 32 bits funciona para arquitectura de 64 bits.


Título: Re: Como comprobar si Windows es de 32 o 64 bits en C++?
Publicado por: Kajjin112 en 27 Junio 2013, 05:31 am
Si, pero prefiero usar las versiones de 64 bits si el sistema operativo lo admite, para un mejor aprovechamiento de los recursos. No es solo el CCleaner, hay 2 o 3 programas mas con los que tuve que hacer lo mismo.