2

開いているプロセス、ウィンドウ、スレッドなどに関する情報を収集する MinGW に準拠した Windows XP アプリケーションがあります。また、1 分に 1 回実行するスケジュールされたタスクを作成します。テキスト ファイルを開き、書き込み、閉じる関数が 2 つあります。2 番目の関数は完全に機能し、最初の関数は最初の実行でのみ機能します。.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;
}

私はそれをスキャンし、寛大なブレークポイントでデバッガーを実行しましたが、どこに障害点があるかを見つけることができません. トラブルシューティングで見つけた限り、エラーは具体的には書き込みで発生します。書き込むデータがあり、2 番目の作業関数と同様に、ファイルを適切に開きます。

EnumWindowsProc編集: 数時間のデバッグの後、最初の実行後に決して実行されないことがわかりました。何よりも先にプロセスの先頭でテストメッセージを開いて書いてみましたが、2回目は通過しません。

4

2 に答える 2

0

問題が見つかりました。「SYSTEM」の下にschtaskを作成していましたが、「SYSTEM」には列挙するデスクトップがありません。現在のユーザーで実行するように変更したところ、正常に機能しました。

于 2013-07-29T16:45:32.280 に答える