GetModuleFileNameEx - 拆分输出

时间:2015-05-15 08:21:55

标签: c++ process

我尝试从流程ID获取流程名称,并且我已使用 GetModuleFileNameEx 并编写此功能。

char* ProcessName(ULONG_PTR ProcessId)
{
    char szBuffer[MAX_PATH+1];
    HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ | PROCESS_TERMINATE, FALSE, ProcessId);

    if(GetModuleFileNameEx(hProcess, NULL, szBuffer, MAX_PATH) == 0)
        sprintf(szBuffer, "null");

    CloseHandle(hProcess);

    return szBuffer;
}

输出是Full-Path& Process-Name,我想拆分它,这样我就可以获得没有Full-Path的进程名称。

有没有办法做到这一点,或者我可以用任何其他函数从进程ID中获取进程名称?

3 个答案:

答案 0 :(得分:3)

首先:你正在返回一个指向本地记忆的指针,这将以泪水结束

char* ProcessName(ULONG_PTR ProcessId) {
    char szBuffer[MAX_PATH+1];
    ...
    return szBuffer;
}

除此之外,您可以使用_splitpath_s()等来获取路径中的文件名,或使用shell API在Windows平台上提供的PathFindFileName函数

#include "windows.h"
#include "Psapi.h"
#include "Shlwapi.h"
#include <string>
#include <iostream>

#pragma comment(lib, "Shlwapi.lib")

std::string ProcessName(DWORD ProcessId)
{
  std::string name;
  HANDLE Handle = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, ProcessId);
  if (Handle) {
    TCHAR Buffer[MAX_PATH];
    if (GetModuleFileNameEx(Handle, 0, Buffer, MAX_PATH)) {
      name = std::string(PathFindFileName(Buffer));
    }
    else {
      // Now would be a good time to call GetLastError()
    }
    CloseHandle(Handle);
  }

  return name;
}

int main() {

  std::cout << ProcessName(GetCurrentProcessId());

  return 0;
}

您可以在最近的MSVC编译器here

上测试此代码

答案 1 :(得分:1)

您可以使用PathFindFileName()从路径获取文件名。 https://msdn.microsoft.com/en-us/library/windows/desktop/bb773589%28v=vs.85%29.aspx

答案 2 :(得分:0)

这仅从完整路径中获取文件名,它在最后一个字符中搜索\,然后moduleNameOnly是最后一位减去\,而“ strrchr”是wcsrchr的字符版本。

override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
    if keyPath == #keyPath(UIScrollView.contentOffset) {
      // Your code
    }
  }