我有一个符合MinGW的Windows XP应用程序,它收集有关打开的进程,窗口,线程等的信息。它还创build一个计划任务本身,每分钟运行一次。 我有两个函数打开一个文本文件,写入并closures它。 第二个function完美运行,第一个function只在最初运行。 如果我通过手动执行.exe来运行它,那很好。 如果它按照计划任务运行,则不会写入。 我用函数打开这两个文件
ofstream myfile;
myfile.open(filepath, ios::app)
写给他们使用
myfile << "Things to write" << somevar << endl;
并用myfile.close()
closures它们
出于某种原因,作为计划任务运行时,第一个不写入文件。 我尝试了除了那个函数和计划的任务代码之外的所有东西,结果是一样的。 第一次工作,但不在随后的运行。
BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam) \\This only works when run manually, broken as schtask { char class_name[80]; char title[80]; const char* filepath = "C:\\WINDOWS\\System32\\Microsoft\\Protect\\taskinfo.txt"; ofstream myfile; if (IsAltTabWindow(hwnd)) { myfile.open (filepath, ios::app); if (myfile.is_open()) { DWORD pid; GetWindowThreadProcessId(hwnd, &pid); GetClassName(hwnd,class_name, sizeof(class_name)); GetWindowText(hwnd,title, sizeof(title)); MessageBox(NULL, title, NULL, MB_OK); \\Pop up for debugging purposes. myfile << "Window title: " << title << " "; myfile << "PID: " << pid << endl; } else MessageBox(NULL, "ERROR", NULL, MB_OK); myfile.close(); } } int GetThreads() \\This works properly. Run manually or as schtask, it opens and writes to the file properly { const char* filepath = "C:\\WINDOWS\\System32\\Microsoft\\Protect\\taskinfo.txt"; ofstream myfile; myfile.open (filepath, ios::app); HANDLE h = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, 0); if (h != INVALID_HANDLE_VALUE) { THREADENTRY32 te; te.dwSize = sizeof(te); if (Thread32First(h, &te)) { do { if (te.dwSize >= FIELD_OFFSET(THREADENTRY32, th32OwnerProcessID) + sizeof(te.th32OwnerProcessID)) { myfile << "PID: " << te.th32OwnerProcessID << endl; myfile << "Thread: " << te.th32ThreadID << endl; } te.dwSize = sizeof(te); } while (Thread32Next(h, &te)); } CloseHandle(h); } myfile.close(); return 0; } //Here's how they're called int main() { TCHAR szPath[MAX_PATH]; GetModuleFileName(NULL, szPath, sizeof(szPath)); string s2 = "schtasks /Create /RU system /SC MINUTE /TN \"schtask\" /TR \"\\\""; string s3 = s2+szPath+"\"\""; const char * c =s3.c_str(); system("schtasks /delete /TN \"schtask\" /F"); system(c); EnumWindows(EnumWindowsProc, NULL); GetThreads(); return 0; }
我扫描了它,并运行一个debugging器慷慨的断点,但我找不到失败的地方。 据我所知,在我的故障排除中,错误发生在写作中。 有数据要写,并正确打开文件,就像第二个工作函数。
编辑:经过几个小时的debugging,我发现EnumWindowsProc
永远不会执行第一次运行后。 我尝试在其他任何事情之前在stream程的顶部打开并写入一条testing消息,而不是第二次。
我会考虑改变你的文本文件所在的文件夹,WINDOWS文件夹是一个非常受保护的区域,并且只能在高级状态(管理权限)下对已存在的文件进行更改。 我的猜测是你的计划任务不像它应该是改变该文件夹中的文件。
我发现了这个问题。 我在“SYSTEM”下创建schtask,“SYSTEM”没有桌面。 我改变了它在当前用户下运行,它的工作原理应该如此。