当前位置:首页 > c++ > 正文内容

C++ 获取进程所在目录(进程全路径)

xuwenyan2年前 (2021-07-07)c++453

打开windows任务管理器,会看到很多的进程在运行,随机挑选一个,如何通过c++代码获取某一个进程的所在全路径呢?这也是在windows软件开发中经常遇到的需求。

通过进程名获取进程全路径

由于可能很多进程叫同一个名字,所以获得的结果也有可能是多个

#include <windows.h>
#include <string>
#include <vector>
#include <tlhelp32.h>
#include <Shlwapi.h>
#pragma comment(lib, "Shlwapi.lib")

void GetProcessPath(const std::wstring& process_name, std::vector<std::wstring>& process_path) {
  PROCESSENTRY32 pe32;
  pe32.dwSize = sizeof(pe32);

  HANDLE hSnapShot = ::CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
  if (hSnapShot == INVALID_HANDLE_VALUE)
    return;

  if (!::Process32First(hSnapShot, &pe32)) {
    ::CloseHandle(hSnapShot);
    return;
  }

  do {
    if (StrNCmp(process_name.c_str(), (LPWSTR)pe32.szExeFile, process_name.size()) == 0) {
      HANDLE hSnapShot2 = ::CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, pe32.th32ProcessID);
      if (hSnapShot2 == INVALID_HANDLE_VALUE)
        continue;

      MODULEENTRY32 me32;
      me32.dwSize = sizeof(MODULEENTRY32);
      if (!::Module32First(hSnapShot2, &me32)) {
        ::CloseHandle(hSnapShot2);
        continue;
      }

      process_path.push_back((const wchar_t*)me32.szExePath);
      ::CloseHandle(hSnapShot2);
    }
  } while (::Process32Next(hSnapShot, &pe32));

  ::CloseHandle(hSnapShot);
}

int main() {
  std::vector<std::wstring> process_path;
  GetProcessPath(L"QiDian.exe", process_path);

  return 0;
}

通过进程id获取进程全路径

#include <windows.h>
#include <string>
#include <Psapi.h>
#pragma comment(lib,"psapi.lib")

bool GetPathByProcessId(DWORD process_id, std::wstring& process_path) {
  HANDLE hProcess = ::OpenProcess(PROCESS_ALL_ACCESS, FALSE, process_id);
  if (hProcess == NULL)
    return false;

  wchar_t szPath[MAX_PATH] = { 0 };
  ::GetModuleFileNameEx(hProcess, NULL, szPath, MAX_PATH);
  process_path.assign(szPath);
  return true;
}

int main() {
  std::wstring process_path;
  bool ret = GetPathByProcessId(33368, process_path);

  return 0;
}


    文章作者:xuwenyan
    版权声明:本文为本站原创文章,转载请注明出处,非常感谢,如版权漏申明或您觉得任何有异议的地方欢迎与本站取得联系。

    扫描二维码推送至手机访问。

    版权声明:本文由艺文笔记发布,如需转载请注明出处。

    本文链接:https://www.xuwenyan.com/archives/2127

    分享给朋友:

    “C++ 获取进程所在目录(进程全路径)” 的相关文章

    Visual Studio编译7z源代码

    Visual Studio编译7z源代码

    源代码下载打开地址https://www.7-zip.org/download.html,选择源码下载,可以选择自己需要的版本下载7z.dll编译1:解压源代码包,打开vs解决方案,CPP7zipBundlesFormat7zFFormat7z.dsw,vs会提示升级,不用管,选择升级。2:修改7z...

    C++指针*为什么靠后会比较好?

    C++指针*为什么靠后会比较好?

    大多数书中和大神的代码里,往往指针的*都是靠变量而不是靠类型的,这主要是为了不造成我们第一眼对变量类型的误解和对指针类型的误解,比如: int* p1,p2 我们一眼看上去是不是通常会觉得p1、p1都是一个int*的指针呢?因为我们通常会误把int*当作一个类型,然而无论int*还是i...

    解决程序在xp系统总是莫名奇妙的崩溃问题(/Zc:threadSafeInit- )

    解决程序在xp系统总是莫名奇妙的崩溃问题(/Zc:threadSafeInit- )

    现象:程序在xp系统上面总是莫名其妙的崩溃,检查代码看不出任何问题,感觉代码都很好。即使你远程调试,找到了崩溃的点,当你注释了崩溃点之后,还是会崩溃到别的地方。当你遇到了这种情况的时候,不妨参照一下下面的方法看看,说不定可以解决问题。如何解决?将崩溃程序相关的所有工程代码全部关闭全局变量的线程安全检...

    c++函数模板参数类型限定

    c++函数模板参数类型限定

    函数模板函数模板可以实现对不同数据类型做统一操作,比如比较两个数据的大小:template<typename T> bool compare(T& a,T& b) {   return a...

    static_assert和assert有什么区别?

    static_assert和assert有什么区别?

    static_assert和assert都是断言,都可用于判断一个条件是否成立,并且在条件不成立时及时给出错误提示。那它们用什么不同和需要注意的地方呢? 1:static_assert在编译期执行,而assert在运行期执行。2:static_assert无论在debug模式还是relea...