2012-09-01 6 views
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; 
} 

답변

3

문자열 _text가 가리키는 경우가 아닌 빈 문자열과 동일합니다. 당신은 아마 같은 것을하고 싶지 : 그냥 포인터와 위치 내용의 차이를 명확히하기 위해

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

고마워, 나는 그걸로 갈거야. 그것은 잘 작동했습니다. :) – user780756

2

사용 strcmp() 문자열을 비교 : 포인터 _text가 빈 상태 (empty)의 캐릭터 라인에 동일한 경우는 당신이 확인하고

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

} 
0

을하는 포인터 포인트 :

  • 숯불 * _text : 변수 '텍스트'가있다 바늘. 디버거에서 보면 메모리 주소가 될 16 진수 값을 보유하게됩니다. 귀하의 경우 _text는 문자열 _msg_text의 주소를 보유합니다.

  • _text! = "": 두 개의 포인터가 아닌 내용을 비교하고 있습니다. 이 문장의 ""은 메모리 주소 인 16 진수 값이 될 null 문자열의 위치를 ​​반환합니다. 당신이해야 할 일은

는 널 (null) 문자열 ""

위의 답변이 정확한지에 _text의 내용을 비교합니다.

+0

답변은 기본적으로 투표 수순으로 정렬되며 사용자는 해당 정렬 순서를 변경할 수 있습니다. 그래서 "위의 답변"에 대해 이야기하지 않는 것이 가장 좋습니다 :-) –

+0

설명을 주셔서 감사합니다. 포인터를 비교하려고했는데 ... C에서 여전히 새로운 것을 잊어 버렸습니다. – user780756

관련 문제