Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Roast D en 2 Marzo 2017, 16:17 pm



Título: Problema con visual estudio usando GetModuleFileName();
Publicado por: Roast D en 2 Marzo 2017, 16:17 pm
Estoy creando una funcion para copiar y pegar un ejecutable en una parte de windows. La cuestion es que en dev C++ las apis que usaba haceptaban buffer de tipo char*. En visual me pide parametros de tipo lpwstr.

Código
  1. char buffer[256];
  2. HMODULE exe = GetModuleHandle(0);
  3. GetModuleFileName(exe, (LPWSTR)buffer, 256);
  4. cout<<buffer<<endl;
  5.  
Imprimi en consola el resultado de buffer y lo unico que se ve de la ruta es C. No se copia toda la ruta al buffer. Que debería hacer ?. En dev c++ solo tenia que pasar lo siguiente.

Código
  1. char buffer[256];
  2. HMODULE exe = GetModuleHandle(0);
  3. GetModuleFileName(exe, buffer, 256);
  4. cout<<buffer<<endl;
  5.  

Que tipo de variable debo delcarar el buffer para obtener la ruta de mi exe.

Una de las cosas que vi, es que se usan buffer del tipo wchar_t. Que no estoy seguro de como usarlos, si alguien me puede poner un ejemplo le agradezco.


Título: Re: Problema con visual estudio usando GetModuleFileName();
Publicado por: ivancea96 en 2 Marzo 2017, 18:08 pm
TCHAR puede ser wchar_t o char, según. Puedes comprobarlo con:

Código
  1. #include <typeinfo>
  2. #include <iostream>
  3. #include <windows.h>
  4.  
  5. using namespace std;
  6.  
  7. int main(){
  8. cout << "char: " << typeid(char).name() << endl;
  9. cout << "wchar_t: " << typeid(wchar_t).name() << endl;
  10. cout << "TCHAR: " << typeid(TCHAR).name() << endl;
  11. }

En mi caso, siendo TCHAR un char, me funciona correctamente.

Definiendo "UNICODE", entonces pasa a wchar_t, y el programa quedaría:

Código
  1. #define UNICODE
  2.  
  3. #include <typeinfo>
  4. #include <iostream>
  5. #include <windows.h>
  6.  
  7. using namespace std;
  8.  
  9. int main(){
  10. wchar_t buffer[256];
  11. HMODULE exe = GetModuleHandle(0);
  12. GetModuleFileName(exe, buffer, 256);
  13. wcout << buffer << endl;
  14. }

Nótese que el array ahora es de wchar_t, y que en vez de cout, utilizo wcout. En vez de array de wchar_t también podrías usar array de TCHAR. Sin embargo, te interesa saber en cada caso si es wchar_t o char, así que ponerlo manualmente te librará de problemas.


Título: Re: Problema con visual estudio usando GetModuleFileName();
Publicado por: Roast D en 2 Marzo 2017, 18:32 pm
Si justo acabo de ver mi error. Se trabaja con unicode y no con ascci. Asi que la cuestion de la memoria cambia. Gracias :3.