2016-04-05 9 views
1

Ich habe ein Programm, das eine Datei in demselben Verzeichnis wie einen bereits laufenden Windows-Prozess platzieren muss. Wie kann ich dieses Verzeichnis als std :: string abrufen, damit ich an der richtigen Stelle schreiben kann?C++ - Wie bekomme ich den .exe-Pfad eines laufenden Prozesses als std :: string?

Ich weiß, dass dies keine große Frage ist, aber ich habe mit Google viel gesucht, und ich konnte nichts finden, das auch nur entfernt einer Lösung ähnelt.

EDIT: Ich verwende Code :: Blocks, also wäre eine Lösung, die nicht spezifisch für die Funktionen einer einzelnen IDE ist, am besten.

+2

[ 'GetModuleFileName'] (https://msdn.microsoft.com/en-us/library/windows/desktop/ms683197 muss (v = vs.85) .aspx) wird dafür wahrscheinlich nützlich sein. – WhozCraig

Antwort

1

Um Pfadnamen aktuellen Prozess zu erhalten, verwendet GetModuleFilename wie bereits erwähnt.

Um den Pfadnamen eines anderen Prozesses zu erhalten, verwenden Sie GetModuleFileNameEx. Unicode Beispiel:

#include <Windows.h> 
#include <psapi.h> 

#pragma comment(lib, "Psapi") 

int main() 
{ 
    wchar_t buf[MAX_PATH]; 
    DWORD pid = 123; 
    std::cout << pid << std::endl; 
    HANDLE handle = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, pid); 
    if (handle) 
    { 
     GetModuleFileNameExW(handle, 0, buf, MAX_PATH); 
     CloseHandle(handle); 
     std::wcout << buf << "\n"; 
    } 

    return 0; 
} 

Dieser Code "Psapi.lib" Bibliothek

+0

ps, ​​in Code :: Blocks sollte die Psapi-Bibliothek auf '"% MinGW% \ lib \ libpsapi.a "' stehen –

2

Wenn Sie Ihr Programm für Windows entwickeln, können Sie den API-Aufruf GetModuleFilename() verwenden und dann den Dateinamen vom gesamten Pfad entfernen. Hier ist Beispiel:

#include "stdafx.h" 
#include <windows.h> 
#include <string> 
#include <regex> 
using namespace std; 

bool MakeNearFilename(const wstring& strPreferredFilename, wstring& strOutputFilename) 
{ 
    WCHAR strExePath[MAX_PATH]; 
    if (!::GetModuleFileNameW(NULL, strExePath, _countof(strExePath))) { 
     return false; 
    } 

    match_results<const WCHAR*> results; 
    if (regex_match(strExePath, results, wregex(L"^(.+\\\\)?(.+?)\\.exe$"))) { 
     strOutputFilename = wstring(results[1]) + strPreferredFilename); 
    } 
    else { 
     strOutputFilename = strPreferredFilename; 
    } 

    return true; 
} 

int main() 
{ 
    wstring strFilename; 
    MakeNearFilename(L"MyProgram.log", strFilename); 
    return 0; 
} 
+0

Danke! Was ist _countof? Ich erhalte den Fehler "Nicht in diesem Bereich erklärt" und Google sagt mir nicht, worum es sich handelt. – NotAshley

+0

Dann können Sie oder MAX_PATH oder sizeof (strExePath)/sizeof (strExePath [0]) anstelle von _countof (strExePath) verwenden. – CodeFuller

+0

Ich bekomme auch "error: keine passende Funktion für den Aufruf von 'regex_match (WCHAR [260], std :: match_results &, std :: wregex)' |" – NotAshley

Verwandte Themen