gpt4 book ai didi

c++ - 作为计划任务运行的 .exe 不写入文件

转载 作者:可可西里 更新时间:2023-11-01 10:47:23 26 4
gpt4 key购买 nike

我有一个符合 MinGW 的 Windows XP 应用程序,它收集有关打开的进程、窗口、线程等的信息。它还为自己创建一个每分钟运行一次的计划任务。我有两个函数可以打开一个文本文件,写入它,然后关闭它。第二个功能完美运行,第一个功能仅适用于初始运行。如果我通过手动执行 .exe 来运行它,那很好。如果它作为计划任务运行,则不会写入。我用函数打开这两个文件

ofstream myfile;

myfile.open(filepath, ios::app)

写信给他们使用

myfile << "Things to write" << somevar << endl;

并用 myfile.close() 关闭它们

由于某些原因,作为计划任务运行时,第一个不写入文件。我试着注释掉除了那个函数和计划任务代码之外的所有内容,结果是一样的。第一次有效,但在后续运行中无效。

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;
}

我扫描了它并运行了一个带有大量断点的调试器,但我找不到它的故障点。据我在故障排除中所能找到的,该错误专门发生在写作中。有数据要写入,它会正确打开文件,就像第二个工作函数一样。

编辑:经过几个小时的调试,我发现 EnumWindowsProc第一次运行后永远不会执行。我尝试在流程的顶部打开并编写一条测试消息,然后再进行其他操作,但第二次没有通过。

最佳答案

我会考虑更改您的文本文件所在的文件夹,WINDOWS 文件夹是一个非常 protected 区域,对已经存在的文件的更改只能在提升状态(管理员权限)下进行。我的猜测是您的计划任务没有像更改该文件夹中的文件那样提升。

关于c++ - 作为计划任务运行的 .exe 不写入文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17840354/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com