Cita de: BlackZeroX (Astaroth) en 17 Septiembre 2012, 23:57 PM
Se supone que no se debe de hacer esto (retornar el punto a una variable automática que ya se murió, quien sabe a que apunte despues de su destrucción)...Código (cpp, 5) [Seleccionar]
char* GetMainExecutablePath() {
TCHAR szEXEPath[2048];
GetModuleFileName ( NULL, szEXEPath, 2048 );
return (char*)szEXEPath;
}
Sin embargo algo así si se podría... evitamos que se destruya al terminar la función...
* OJO TCHAR puede tomar un formato UNICODE o ANSI según los define... así que mejor retornamos un puntero a TCHARCódigo (cpp, 3) [Seleccionar]
const TCHAR *GetMainExecutablePath() {
static TCHAR szEXEPath[2048] = {};
GetModuleFileName ( NULL, szEXEPath, 2048 );
return szEXEPath;
}
pero como es C++, podemos construir una clase string directamente en el retorno de la función.Código (cpp) [Seleccionar]
#include <string>
string GetMainExecutablePath() {
TCHAR szEXEPath[2048] = {};
GetModuleFileName ( NULL, szEXEPath, 2048 );
return (string)szEXEPath;
}
Los caracteres raros aparecen por que se necesita un final de cadena:
* Si TCHAR toma un formato ANSI solo agrega 1 caracter '\0' (NULL) al finald e la cadena.
* Si TCHAR toma un formato UNICODE solo agrega 2 caracteres '\0' (NULL) al final de la cadena.
En el C y creo que también en C11 de c++ hay funciones especiales para imprimir las cadenas UNICODE.
Si no mal recuerdo en C es wprintf();
https://developer.blackberry.com/native/reference/com.qnx.doc.dinkum/topic/c99/wchar.html
Revisa las bibliotecas:
https://developer.blackberry.com/native/reference/com.qnx.doc.dinkum/topic/bookset.html
Dulces Lunas!¡.
Muschísimas gracias ya lo he solucionado No he hecho lo de devolver como string (ni como TCHAR), ya que me interesa tenerlo como char, así que realizo una conversión de TCAR a char directamente en la función.
He agregado como último carácter el carácter NULL en la cadena y... voilá! Caracteres desaparecidos!!
Muchas gracias por tu respuesta. Me has solucionado todas mis dudas. Nos vemos por el foro men
Ah, por si a alguien le interesa, así es como quedó el código finalmente:
Código [Seleccionar]
char* GetMainExecutablePath() {
TCHAR szEXEPath[2048];
int counter = 0;
GetModuleFileName ( NULL, szEXEPath, 2048 );
for(int j=0; szEXEPath[j]!=0; j++)
{
counter=counter+1;
}
char *actualpath;
actualpath=new char[counter];
for(int j=0; szEXEPath[j]!=0; j++)
{
actualpath[j]=szEXEPath[j];
}
actualpath[counter]='\0';
return actualpath;
}