.exe按计划任务运行不会写入文件

时间:2013-07-24 16:56:51

标签: c++ windows file-io

我有一个符合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永远不会执行。我尝试在进程顶部打开并编写测试消息,然后再进行第二次测试。

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

我发现了问题。我在“SYSTEM”下创建了schtask,而“SYSTEM”没有要枚举的桌面。我将其更改为在当前用户下运行,并且它可以正常工作。