我正在创建一个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;
}
答案 0 :(得分:3)
您正在检查指针_text
是否等于空字符串,而不是_text
指向的字符串是否等于空字符串。你可能想做类似的事情:
if (strlen(_text) !=0)
... rest of your code...
答案 1 :(得分:2)
使用strcmp()
比较字符串:
if (strcmp(_text, "") != 0) {
}
答案 2 :(得分:0)
只是为了澄清指针所指向位置的指针和内容之间的区别:
char * _text:变量'text'是一个指针。如果你在调试器中查看它,它将保存一个十六进制值,它将是一个内存地址。在你的情况下,_text保存字符串_msg_text
_text!=“”:你正在比较两个指针,而不是它们的内容。 “”在此语句中返回空字符串的位置,该字符串将再次为某个十六进制值,即内存地址。
您需要做的是将_text的内容与空字符串“”
进行比较以上答案是正确的。