我对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;
}
任何想法导致崩溃的原因?
如果您需要查看更多代码或获取更多信息,请发表评论。我故意只是将问题包括在内。&#39;为了简洁和清晰起见,这段代码。
答案 0 :(得分:1)
您使用lpszTitle
分配new
,而无需取消分配。根据{{1}} - 循环运行的频率,您可能会非常快地耗尽内存。尝试在函数结束前添加while
。
其他一些花絮:
您似乎将delete[] lpszTitle
与BOOL
混合在一起。我建议使用bool
,因为它是标准的C ++。
手动内存分配是老式的C ++。试试smart pointers。
为什么不在评论中使用std::string(或std::wstring,而不是bool
,而不是char[]
?
在使用变量时声明变量,而不是在函数的开头声明变量(你可能来自fortran?)。
但是,我建议您将最终代码发布到https://codereview.stackexchange.com,以获得更多更好的输入。