1

ユーザーがアプリケーション ウィンドウの [閉じる] ボタンを押したときにチェックする DLL を作成しています。それは正常に動作し、_text グローバル変数が空のときにメッセージが表示されないようにしたいと考えています。単純な if (_text != "") が機能しない理由がわかりません...何か間違っていますか?

#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;
}
4

3 に答える 3

3

が指す文字列が空の文字列と等しいかどうかではなく、ポインター_textが空の文字列と等しいかどうかを確認_textしています。あなたはおそらく次のようなことをしたいと思うでしょう:

if (strlen(_text) !=0)
... rest of your code...
于 2012-09-01T14:28:07.923 に答える
2

strcmp()文字列を比較するために使用します。

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

}
于 2012-09-01T14:27:52.577 に答える
0

ポインタとポインタが指す場所の内容の違いを明確にするために、次のようにします。

  • char * _text:変数'text'はポインタです。デバッガーで見ると、メモリアドレスとなる16進値を保持します。あなたの場合、_textは文字列_msg_textのアドレスを保持します

  • _text!= "":内容ではなく、2つのポインターを比較しています。このステートメントの""は、メモリアドレスである16進値となるnull文字列の場所を返します。

_textの内容をnull文字列""と比較する必要があります

上記の答えは正解です。

于 2012-09-01T14:34:17.697 に答える