Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Nobody12 en 10 Enero 2011, 21:47 pm



Título: Problemas con WinApi
Publicado por: Nobody12 en 10 Enero 2011, 21:47 pm
Hola.

Primero de todo aclarar que acabo de empezar con WINAPI y por eso puede ser que mis dos errores sean realmente una tontería.
Hasta ahora sólo me he leído algunas páginas del curso de WinApi de conclase.net.
De C++ sé bastante más, me he leído libros, tutoriales, he creado muchos programas de consola, aunque realmente sé poco y cometo siempre errores parecidos.

Volviendo al tema.
Estoy haciendo un programa que a la vez es un Crackme, ya que has de registrarte para poder desinhibir un POPUP que incialmente está en MF_GRAYED.
Como he dicho antes tengo dos problemas:

1. Cuando se pulsa la función Registrar, se crea un diálogo en el que aparecen 3 Controles Edit (ID, Nombre, Serial).
El ID es un número y para obtener el valor uso la función GetDlgItemInt, y me funciona correctamente.
El problema viene con el nombre y el serial que son caracteres (tanto letras como números), y para ellos utilizo GetDlgItemText.
No sé qué estoy haciendo mal, pero la función no me devuelve ninguna cadena.
Lo que hago es ésto:


Código
  1. LRESULT CALLBACK WindowProcedure(HWND hwnd, UINT msg, WPARAM wParam,
  2. LPARAM lParam)
  3. ...
  4. case WM_COMMAND:
  5. if(LOWORD(wParam) == CM_REGISTRO)
  6. {
  7. DialogBoxParam(hInstance, "Registro", hwnd, DlgProc, (LPARAM)&Datos);
  8. }
  9. ...
  10.  
  11. BOOL CALLBACK DlgProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam)
  12. ...
  13. int numero1;
  14. char nombre[26];
  15. ...
  16. case WM_COMMAND:
  17. if(LOWORD(wParam) == IDOK)
  18. {
  19. numero1 = GetDlgItemInt(hDlg, ID_IDENT, &NumeroOk3, FALSE);
  20. GetDlgItemText(hDlg, ID_NOMBRE, nombre, 26);
  21. ...
  22. }
  23. ...
  24.  
  25.  

Simplemente es como si no estuviera la api.
Para comprobar si me retorna valor he probado ésto:

Código
  1. if(nombre=="HOLA")
  2. {
  3.    MessageBox(hDlg, "Hola", "", MB_ICONEXCLAMATION | MB_OK);
  4.           EndDialog(hDlg, FALSE);
  5. }
  6.  
Y cuando escribo HOLA en el Edit Nombre no me sale el cartel.
He pensado que puede ser que no he declarado correctamente la cadena nombre o la comparación se está haciendo mal, pero lo he intentado de otras formas y me salen otros errores.

2. Para volver a habilitar el POPUP Nuevo utilizo EnableMenuItem, pero Nuevo es un POPUP y no un MENUITEM, y no tiene el parámetro uEnable (o al menos eso creo xD).
Estoy pensando en deshabilitar directamente todos los Ítems que resultan de pulsar Nuevo.
Sin embargo sigo teniendo otro problema de una forma u otra, y es que utilizando el EnableMenuItem se necesita el handle del menú, y cuando llamo a la api estoy en el DlgProc y no en la función en la que se crean los menús que es donde se encuentra el handle:

Código
  1. void InsertarMenu(HWND hwnd)
  2. {
  3. HMENU hMenu1, hMenu2, hMenu3, hMenu4;
  4.     hMenu1 = CreateMenu(); /* Manipulador de la barra de menú */
  5.     hMenu2 = CreateMenu();
  6.     hMenu3 = CreateMenu();
  7.     hMenu4 = CreateMenu();
  8.     /* Primer POP-UP */
  9.     AppendMenu(hMenu2, MF_STRING | MF_POPUP | MF_GRAYED, (UINT)hMenu4, "&Nuevo");
  10. ...
  11. AppendMenu(hMenu1, MF_STRING | MF_POPUP, (UINT)hMenu2, "&Archivo");
  12. SetMenu (hwnd, hMenu1);
  13. }
  14.  

Gracias y espero que si leéis el mensaje y podéis aportar algo lo hagáis y no se quede el tema sin respuestas como ya me ha pasado varias veces...   :-(

PD: He subido lo que llevo de programa a 4shared.com.

http://www.4shared.com/file/fRXIfbsk/Programa.html (http://www.4shared.com/file/fRXIfbsk/Programa.html)