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
#include <stdio.h>
#include <stdlib.h>
#include <Windows.h>
typedef int (CALLBACK *MSBX)(HWND, LPCTSTR, LPCTSTR, UINT);
int main(int *argv, char *argc){
HMODULE han;
MSBX msgbox;
han = LoadLibrary(L"User32.dll");
msgbox = (MSBX)GetProcAddress(han, "MessageBoxA");
msgbox(NULL,"mensaje","exito!!", NULL);
}
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
han = LoadLibrary(L"User32.dll");
pero para que es esa "L"?...
han = LoadLibrary(L"User32.dll");
ahora me aparece marcado esto
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
UNICODEsi 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:
msgbox = (MSBX)GetProcAddress(han, "MessageBoxA");
vos buscás la versión ansi (MessageBox
A)
también existe la versión wide
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:
#ifdef UNICODE
msgbox = (MSBX)GetProcAddress(han, "MessageBoxW");
#else
msgbox = (MSBX)GetProcAddress(han, "MessageBoxA");
#endif
entonces podrías llamar a tu función de la forma:
msgbox(NULL,:_T("mensaje"),_T("exito!!"), NULL);
sino, si solo te interesa utilizar ansi, tendrías que redefinir tu puntero a función:
typedef int (CALLBACK *MSBX)(HWND, LPCSTR, LPCSTR, UINT);
S2