Simple si la comparación no funciona con char

Estoy creando una DLL para verificar cuándo el usuario presiona el botón de cerrar en la ventana de la aplicación, funciona bien, luego quiero hacerlo para que cuando la variable global _text esté vacía, no se muestre ningún mensaje. No puedo entender por qué un simple if (_text != "") no funciona... ¿estoy haciendo algo mal?

#include <windows.h>
#define export extern "C" __declspec (dllexport)

WNDPROC GameWndProc = NULL;
HWND GameHwnd = NULL;
double _button_result = 0;
char* _text;
char* _title;

LRESULT CALLBACK SubClassWndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    switch(uMsg) {
        case WM_CLOSE:

            if (_text != "") {
                if (MessageBox(GameHwnd, (LPSTR)_text, (LPSTR)_title, MB_YESNO|MB_APPLMODAL) == IDYES) {
                    _button_result = 1;
                    return 0;
                } else {
                    return 0;
                }
            }           

            _button_result = 1;
            return 0;
        break;
    }

    return CallWindowProc(GameWndProc, hwnd, uMsg, wParam, lParam);
}

export double _window_check_close_init(double window_handle, char* _msg_text, char* _msg_title)
{
    GameHwnd = (HWND)(int)window_handle;
    GameWndProc = (WNDPROC)SetWindowLongPtr(GameHwnd, GWL_WNDPROC, (LONG)SubClassWndProc);
    _text = _msg_text;
    _title = _msg_title;

    if (!GameWndProc) {
        return 0;
    }

    return 1;
}

export double _window_check_close()
{
    if (_button_result == 1) {
        _button_result = 0;
        return 1;
    } else {
        return 0;
    }
}

BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
{
    if (fdwReason == DLL_PROCESS_DETACH) {
        if (IsWindow(GameHwnd) && GameWndProc) {
            SetWindowLongPtr(GameHwnd, GWL_WNDPROC, (LONG)GameWndProc);
        }
    }
    return TRUE;
}

preguntado el 01 de septiembre de 12 a las 15:09

3 Respuestas

Estás comprobando si el puntero _text es igual a la cadena vacía, no si la cadena apuntada por _text es igual a la cadena vacía. Probablemente quieras hacer algo como:

if (strlen(_text) !=0)
... rest of your code...

Respondido el 01 de Septiembre de 12 a las 15:09

Utiliza strcmp() para comparar cadenas:

if (strcmp(_text, "") != 0) {

}

Respondido el 01 de Septiembre de 12 a las 15:09

Solo para aclarar la diferencia entre los punteros y el contenido de la ubicación a la que apunta el puntero:

  • char* _text : La variable 'texto' es un puntero. Si lo mira en un depurador, tendría un valor hexadecimal que sería una dirección de memoria. En su caso, _text contiene la dirección de la cadena _msg_text

  • _text != "" : Estás comparando dos punteros, no sus contenidos. "" en esta declaración está devolviendo la ubicación de la cadena nula que nuevamente sería un valor hexadecimal que es una dirección de memoria.

Lo que debe hacer es comparar el contenido de _text con la cadena nula ""

Las respuestas anteriores son correctas.

Respondido el 01 de Septiembre de 12 a las 15:09

Las respuestas de forma predeterminada se ordenan por número de votos y los usuarios pueden cambiar ese orden de clasificación. Así que es mejor no hablar de "respuestas anteriores" :-) - steve jesop

Gracias por la aclaración, olvidé por completo que estaba tratando de comparar un puntero... aún nuevo en C. - user780756

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.