elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: AIO elhacker.NET 2021 Compilación herramientas análisis y desinfección malware


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  ayuda con VisualStudio2010,para que es "L" y "_T" y como lo arreglo[SOLUCIONADO]
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: ayuda con VisualStudio2010,para que es "L" y "_T" y como lo arreglo[SOLUCIONADO]  (Leído 5,220 veces)
Belial & Grimoire


Desconectado Desconectado

Mensajes: 559


Tea_Madhatter


Ver Perfil
ayuda con VisualStudio2010,para que es "L" y "_T" y como lo arreglo[SOLUCIONADO]
« en: 31 Mayo 2012, 02:31 am »

hola

una pregunta, casi siempre e programado con MingW en windows, ahora quise usar Visual Studio 2010 y dejar GCC para linux

quise hacer un hook rapido a MessageBoxA, para ejecutar el clasico mensaje de hola mundo y probar como funciona, ya que siempre trabaje con codeblocks

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <Windows.h>
  4.  
  5. typedef int (CALLBACK *MSBX)(HWND, LPCTSTR, LPCTSTR, UINT);
  6.  
  7. int main(int *argv, char *argc){
  8.  
  9. HMODULE han;
  10. MSBX msgbox;
  11.  
  12. han = LoadLibrary(L"User32.dll");
  13. msgbox = (MSBX)GetProcAddress(han, "MessageBoxA");
  14.  
  15. msgbox(NULL,"mensaje","exito!!", NULL);
  16.  
  17. }

pero tengo una duda, como arreglo o cual es la nueva forma de llamar ciertas cosas por ejemplo

LoadLibrary, asi encontre que tenia que hacerlo funcionar

Código:
han = LoadLibrary(L"User32.dll");

pero para que es esa "L"?...
Código:
han = LoadLibrary(L"User32.dll");

ahora me aparece marcado esto

Código:
msgbox(NULL,"mensaje","exito!!", NULL);

"mensaje" y "exito!!"

si lo dejo asi, me aparece bien el mensaje, pero para quitar el mensaje de error, tengo que poner igual "L", tambien encontre que con "_T"... pero no me funciono

el mensaje de error es sobre puntero a char* que no es compatible con LPCTSTR

y con MingW y codeblocks nunca tuve ese problema, que podria hacer para solucionarlo? y si puede solucionar permanentemente o es algo que siempre tendre que ver como arreglarlo?

salu2


« Última modificación: 31 Mayo 2012, 05:04 am por Belial & Grimoire » En línea

.                                 
x64core


Desconectado Desconectado

Mensajes: 1.908


Ver Perfil
Re: ayuda con Viual Studio 2010, para que es "L" y "_T" y como lo arreglo?
« Respuesta #1 en: 31 Mayo 2012, 03:02 am »

lo de la L es para indicarle al compiador que la cadena siguiente debe tratarla como formato unicode.
lo del msgbox... :laugh: copiaste eso de algun codigo de VB seguramente... porque no hay ninguna API que se llame así
debes de usar el MessageBox, recordar que estan las APIs para ANSI y para UNICODE ( A, W respectivamente )


En línea

Belial & Grimoire


Desconectado Desconectado

Mensajes: 559


Tea_Madhatter


Ver Perfil
Re: ayuda con Viual Studio 2010, para que es "L" y "_T" y como lo arreglo?
« Respuesta #2 en: 31 Mayo 2012, 03:17 am »

no lo copie

lo que hice fue una llamada a una api con GetProcAddress

el typedef es un puntero a la API MessageBoxA

ya con eso no es necesario llamar a la api directamente, solo a su direccion

pero entonces como lo quito, porque con gcc solo al compilarlo con C, no me decia nada, todo estaba bien, pero ahora con VS 2010 me salieron con que _T y L

al usat _T y L en messagebox, solo me aparece la primera letra, algo que encontre es que necesitaba la libreria

tchar.h, ya lo hice y ya funciona _T y L bien, pero al ejecutarlo solo toma el primer caracter

la unica manera de que me aparezca todo completo es dejarlo con el error, pero no se si hacer eso se normal o habra como corregir eso

En línea

.                                 
Belial & Grimoire


Desconectado Desconectado

Mensajes: 559


Tea_Madhatter


Ver Perfil
Re: ayuda con Viual Studio 2010, para que es "L" y "_T" y como lo arreglo?
« Respuesta #3 en: 31 Mayo 2012, 05:02 am »

hola

ya lo resolvi

solo hay que ir a Propiedades de proyecto->General->Juego de caracteres

y alli elegir la opcion de

Citar
usar juego de caracteres multibyte

y listo, no se si sea optimo, pero almenos ya no necesite la libreria tchar.h y usar _T() ni L
En línea

.                                 
x64core


Desconectado Desconectado

Mensajes: 1.908


Ver Perfil
Re: ayuda con VisualStudio2010,para que es "L" y "_T" y como lo arreglo[SOLUCIONADO]
« Respuesta #4 en: 31 Mayo 2012, 05:23 am »

hola... jajaja cierto no me fije que lo obtenias la direccion con la API xD no modificaste el codigo? jaja
bueno si no queres usar unicode basta con que uses APIs de tipo ANSI
En línea

Belial & Grimoire


Desconectado Desconectado

Mensajes: 559


Tea_Madhatter


Ver Perfil
Re: ayuda con VisualStudio2010,para que es "L" y "_T" y como lo arreglo[SOLUCIONADO]
« Respuesta #5 en: 31 Mayo 2012, 06:12 am »

hola

jeje, no... ya no tuve que modificar nada, solo espero no afecte en nada, el hecho de no saber bien para que sirve y como hacerlos funcionar

ya que de todas formas me gusta mas C y no recuerdo haberlo necesitado nunca

salu2
En línea

.                                 
Karman


Desconectado Desconectado

Mensajes: 673



Ver Perfil WWW
Re: ayuda con VisualStudio2010,para que es "L" y "_T" y como lo arreglo[SOLUCIONADO]
« Respuesta #6 en: 1 Junio 2012, 04:45 am »

hola

una pregunta, casi siempre e programado con MingW en windows, ahora quise usar Visual Studio 2010 y dejar GCC para linux

quise hacer un hook rapido a MessageBoxA, para ejecutar el clasico mensaje de hola mundo y probar como funciona, ya que siempre trabaje con codeblocks

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <Windows.h>
  4.  
  5. typedef int (CALLBACK *MSBX)(HWND, LPCTSTR, LPCTSTR, UINT);
  6.  
  7. int main(int *argv, char *argc){
  8.  
  9. HMODULE han;
  10. MSBX msgbox;
  11.  
  12. han = LoadLibrary(L"User32.dll");
  13. msgbox = (MSBX)GetProcAddress(han, "MessageBoxA");
  14.  
  15. msgbox(NULL,"mensaje","exito!!", NULL);
  16.  
  17. }

pero tengo una duda, como arreglo o cual es la nueva forma de llamar ciertas cosas por ejemplo

LoadLibrary, asi encontre que tenia que hacerlo funcionar

Código:
han = LoadLibrary(L"User32.dll");

pero para que es esa "L"?...
Código:
han = LoadLibrary(L"User32.dll");

ahora me aparece marcado esto

Código:
msgbox(NULL,"mensaje","exito!!", NULL);

"mensaje" y "exito!!"

si lo dejo asi, me aparece bien el mensaje, pero para quitar el mensaje de error, tengo que poner igual "L", tambien encontre que con "_T"... pero no me funciono

el mensaje de error es sobre puntero a char* que no es compatible con LPCTSTR

y con MingW y codeblocks nunca tuve ese problema, que podria hacer para solucionarlo? y si puede solucionar permanentemente o es algo que siempre tendre que ver como arreglarlo?

salu2

el problema es la definición que usás para el tipo de argumento que vas a utilizar:

LPCTSTR -> es un formato "variable" dependiendo si está o no definido UNICODE

si está definido UNICODE (dentro de los parámetros del proyecto lo encontrás) entonces la definición

LPCTSTR -> se traduce en -> LPCWSTR (puntero a wide string)

si no está definido UNICODE entonces

LPCTSTR -> se traduce en -> LPCSTR (puntero a ansi string)

y en tu definición llamada a getprocaddres:

Código
  1. msgbox = (MSBX)GetProcAddress(han, "MessageBoxA");

vos buscás la versión ansi (MessageBoxA)

también existe la versión wide

Código
  1. msgbox = (MSBX)GetProcAddress(han, "MessageBoxW");

por lo tanto, si queres que tu code se compatible tanto con wide string como con ansi string, te convendría hacer algo como:

Código
  1. #ifdef UNICODE
  2. msgbox = (MSBX)GetProcAddress(han, "MessageBoxW");
  3. #else
  4. msgbox = (MSBX)GetProcAddress(han, "MessageBoxA");
  5. #endif

entonces podrías llamar a tu función de la forma:

Código
  1. msgbox(NULL,:_T("mensaje"),_T("exito!!"), NULL);

sino, si solo te interesa utilizar ansi, tendrías que redefinir tu puntero a función:

Código
  1. typedef int (CALLBACK *MSBX)(HWND, LPCSTR, LPCSTR, UINT);

S2
« Última modificación: 1 Junio 2012, 04:49 am por Karman » En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines