0

したがって、コンピューターで実行されているプロセスのリストを取得してから、各プロセスの完全なパスを取得する必要があります。(各プロセスが実行されるフォルダーを探しています)。私は QueryFullProcessImageName - http://msdn.microsoft.com/en-us/library/windows/desktop/ms684919(v=vs.85).aspxを使用していましたが、このコードが Windows XP で動作する必要があることがわかりました。その機能の最小クライアントは Vista です。

それで、これを行う別の方法を知っている人はいますか?

GetModuleFileNameEx を使用しようとしていましたが、うまくいきませんでした。Process ハンドルを渡すと、出力に返されるのは「ííííííííííííííííííííííííííííííí」だけでした。

編集: これは GetModuleFileNameEx を使用する私の試みでした:

HANDLE hProcessSnap;
PROCESSENTRY32 pe32;
string name = procName;

// Take a snapshot of all processes in the system.
hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if (hProcessSnap == INVALID_HANDLE_VALUE)
{
    REPORT_ERROR("CreateToolhelp32Snapshot (of processes): err=%d\n", ::GetLastError());
    return false;
}

// Set the size of the structure before using it.
pe32.dwSize = sizeof(pe32);

// Retrieve information about the first process,
// and exit if unsuccessful
if( !Process32First(hProcessSnap, &pe32))
{
    REPORT_ERROR("Process32First: err=%d\n", ::GetLastError());  // Show cause of failure
    CloseHandle(hProcessSnap);     // Must clean up the snapshot object!
    return false;
}
char pName[MAX_PATH];

//iterate through all processes
do {
    //Find start of files name
    char *szProcessFilename = strchr(pe32.szExeFile, '\\');
    if (szProcessFilename == NULL)
        szProcessFilename = pe32.szExeFile;
    else
        szProcessFilename++;    //Skip over last slash

    if (_stricmp(procName, szProcessFilename) == 0)
    {
        HANDLE hProcess = OpenProcess( PROCESS_QUERY_INFORMATION, false, pe32.th32ProcessID );
        char procLocationChar[MAX_PATH];
        DWORD exe_path_size = MAX_PATH;
        DWORD s = GetModuleFileNameEx(hProcess, NULL, pName, exe_path_size);

この後、パスを取得するためにさらにいくつかのことを行いますが、pNameの値は単に「ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ」です。

4

1 に答える 1

0

プロセスのリストを取得するには、 PSAPIからEnumProcesses関数を使用できます。結果のPIDでOpenProcessを使用し、ハンドルでGetModuleFileNameExを使用して、実行可能ファイル名を取得します。このようなもの:

const size_t maxPids = 1024;

std::set<std::wstring> processes;

DWORD pids[maxPids] = {};
DWORD bytesReturned = 0;

if (::EnumProcesses(pids, sizeof pids, &bytesReturned))
{
    DWORD cProcesses = bytesReturned / sizeof *pids;

    // set SeDebug privilege

    for (DWORD i = 0; i < cProcesses; i++)
    {
        DWORD pid = pids[i];

        if (HANDLE hProcess = ::OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, pid))
        {
            WCHAR filename[MAX_PATH] = {};

            if (::GetModuleFileNameEx(hProcess, NULL, filename, MAX_PATH))
            {
                processes.insert(filename);
            }
            else
            {
                // handle error
            }

            ::CloseHandle(hProcess);
        }
        else
        {
            // handle error
        }
    }

    // disable SeDebug privilege
}
else
{
    // handle error
}

開くことができないプロセス(システム、アイドルなど)があることに注意してください。最初にそれらをフィルタリングするか、エラーを無視することをお勧めします。また、システム環境によっては、自分で作成していないプロセスを開くための特別な権限(SeDebugPrivilege)が必要になる場合があります。OpenProcess関数のドキュメントを参照してください。

于 2012-09-18T10:49:38.063 に答える