Problema con visual estudio usando GetModuleFileName();

Iniciado por Roast D, 2 Marzo 2017, 16:17 PM

0 Miembros y 1 Visitante están viendo este tema.

Roast D

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 (cpp) [Seleccionar]
char buffer[256];
HMODULE exe = GetModuleHandle(0);
GetModuleFileName(exe, (LPWSTR)buffer, 256);
cout<<buffer<<endl;

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 (cpp) [Seleccionar]
char buffer[256];
HMODULE exe = GetModuleHandle(0);
GetModuleFileName(exe, buffer, 256);
cout<<buffer<<endl;


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.

ivancea96

TCHAR puede ser wchar_t o char, según. Puedes comprobarlo con:

Código (cpp) [Seleccionar]
#include <typeinfo>
#include <iostream>
#include <windows.h>

using namespace std;

int main(){
cout << "char: " << typeid(char).name() << endl;
cout << "wchar_t: " << typeid(wchar_t).name() << endl;
cout << "TCHAR: " << typeid(TCHAR).name() << endl;
}


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

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

Código (cpp) [Seleccionar]
#define UNICODE

#include <typeinfo>
#include <iostream>
#include <windows.h>

using namespace std;

int main(){
wchar_t buffer[256];
HMODULE exe = GetModuleHandle(0);
GetModuleFileName(exe, buffer, 256);
wcout << buffer << endl;
}


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.

Roast D

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.