为什么抓取窗口标题的代码会导致应用崩溃?
Why is the code that grabs a window title causing an app crash?
我对C++很陌生,但已经制作了一个控制台应用程序,该应用程序会等到它检测到具有某个标题的窗口,然后执行一些代码。只要它检测到窗口,它就会工作得很好。但是,我注意到,如果应用程序正在运行并且窗口没有出现,那么在 4 分 20 秒(大约(后它会崩溃。
崩溃信息只是说APPCRASH归因于ntdll.dll
我在代码中放置了断点,并将其缩小到导致崩溃的这段代码。
// GRAB WINDOW TITLE AND PUT IT IN "lpszTitle"
int nLen = GetWindowTextLength(hWnd);
LPSTR lpszTitle = new CHAR[nLen + 1];
GetWindowText(hWnd, lpszTitle, nLen);
此代码后跟一个"if"语句,当窗口标题与某个字符串匹配时,该语句执行主代码。
在此之前,这段代码只是在 while(1( 循环上运行等待。
下面是更完整的代码列表。
#pragma once
#undef UNICODE
#include <windows.h>
#include <iostream>
#include <string>
#include <sstream>
#include <tchar.h>
#include <cassert>
#include <cstdio>
#include <stdlib.h>
#include <mmsystem.h>
#include <time.h>
// Example of the __stdcall keyword
#define WINAPI __stdcall
using namespace std;
HMODULE hLib;
BOOL CALLBACK SearchProc(HWND hWnd, LPARAM lParam)
{
// THIS FUNCTION SEARCHES ALL OPEN WINDOWS
// UNTIL IT FINDS ONE WITH "DX" IN IT'S TITLE
// IT THEN GRABS THE MEMORY ADDRESS REFERENCED
// BELOW WHICH CONTAINS THE "TOTALOUT" VARIABLE
// FOR THE FRUIT MACHINE
// INITIALISE VARIABLES FOR USE IN THIS FUNCTION
DWORD address = 0x96e0a4;
long currentMachinePaidOutTotal = 0;
long unsortedTotalcurrentMachinePaidOutTotal = 0;
long calculatedWinnings = 0;
long oldAmountMachinePaidOut = 0;
bool initialiseOldAmountMachinePaidOut = false;
bool slowMachine = false;
bool payoutFiverOneShot = false;
string currentWindowName = "";
DWORD pid;
// GRAB WINDOW TITLE AND PUT IT IN "lpszTitle"
int nLen = GetWindowTextLength(hWnd);
LPSTR lpszTitle = new CHAR[nLen + 1];
GetWindowText(hWnd, lpszTitle, nLen);
// LET'S CHECK IF WINDOW HAS "DX" IN TITLE
if (strstr(lpszTitle, "DX") && !strstr(lpszTitle, "=")) {
cout << "nFound window with name: " << lpszTitle << "n";
currentWindowName = lpszTitle;
// Found "DX" in the title of the window
// CONTINUE WITH CODE IN HERE....
return TRUE;
}
else {
// NO WINDOW WITH "DX" IN THE TITLE OPEN YET
}
return TRUE;
}
int main(int argc, char *argv[])
{
hLib = LoadLibrary("cash.dll");
assert(hLib != NULL); // pass !!
while (1)
{
EnumWindows(SearchProc, NULL);
}
return 0;
}
知道为什么会导致崩溃吗?
如果您需要查看更多代码或获取更多信息,请发表评论。为了简洁明了,我故意只包含"问题"代码段。
您将lpszTitle
与new
一起分配,而无需解除分配它。根据while
循环运行的频率,内存可能会很快耗尽。尝试在函数结束之前添加delete[] lpszTitle
。
其他一些花絮:
-
你似乎把
BOOL
和bool
混为一谈.我建议bool
,因为它是标准C++。 -
手动内存分配是老式C++。尝试智能指针。
为什么不使用 std:: string(或 @IInspectable 在评论中建议的 std::wstring(而不是
char[]
?在使用变量时声明变量,而不是全部在函数的开头声明(您可能来自 fortran?
为什么"使用命名空间 std"被认为是不好的做法?
但是,我建议您发布最终代码到 https://codereview.stackexchange.com 以获取更多更好的输入。
相关文章:
- 使用调试/崩溃报告将应用程序部署到客户端
- 应用程序崩溃并显示"symbol _ZdlPvm, version Qt_5 not defined in file libQt5Core.so.5 with link time reference"
- 如何找出应用程序崩溃的原因 - Win 10 LTSB
- 操纵安卓相机的深度图导致应用程序崩溃
- 为什么从文件获取图标时应用程序有时会崩溃?
- 在 Ubuntu 服务器上运行 QT 应用程序时崩溃
- 调用 java 的回调() 时应用程序崩溃.由于 detatchThread 而获得运行时错误
- Qt应用程序找不到第三方DLL并崩溃
- 由于____chkstk_darwin,在Catalina上使用部署10.10编译的MacOS应用程序在HighSierra版本<崩溃
- QCompleter set模型使应用程序崩溃
- x64 位的 C++/CLI DLL 和 Exe 的应用崩溃
- 为什么抓取窗口标题的代码会导致应用崩溃?
- 使用push_back方法获取智能指针矢量时应用崩溃
- 强制 c++ 应用崩溃
- 提升编程选项使我的应用崩溃
- 为 Web 视图添加 UI 栏按钮项,但应用崩溃
- 应用崩溃.模板
- 使用 C++/CLR dll 时 C# 应用崩溃
- "std::sin"呼叫上的应用崩溃
- 使用特征库运行 UmfPackLU<> 上的应用崩溃