C++ 开始处理64位进程。。。。。。这甚至在“注意,您可以使用QueryFullProcessImageName函数从32位进程检索32位和64位进程的可执行映像的全名。”实际上,现在GetModuleFileNameEx也可以工作,因为当hModule为NUL
C++ 开始处理64位进程。。。。。。这甚至在“注意,您可以使用QueryFullProcessImageName函数从32位进程检索32位和64位进程的可执行映像的全名。”实际上,现在GetModuleFileNameEx也可以工作,因为当hModule为NUL,c++,windows,process,pid,C++,Windows,Process,Pid,开始处理64位进程。。。。。。这甚至在“注意,您可以使用QueryFullProcessImageName函数从32位进程检索32位和64位进程的可执行映像的全名。”实际上,现在GetModuleFileNameEx也可以工作,因为当hModule为NULL时,它使用与QueryFullProcessImageName完全相同的系统调用,但不幸的是,这是未记录的行为。使用WMI-最糟糕的方式,根本不需要另一个(工作)选项,我并没有说这是最好的…是的,但不是最好的。总是问自己-wmi如何做到这一点
开始处理64位进程。。。。。。这甚至在“注意,您可以使用QueryFullProcessImageName函数从32位进程检索32位和64位进程的可执行映像的全名。”实际上,现在
GetModuleFileNameEx
也可以工作,因为当hModule
为NULL
时,它使用与QueryFullProcessImageName
完全相同的系统调用,但不幸的是,这是未记录的行为。使用WMI-最糟糕的方式,根本不需要另一个(工作)选项,我并没有说这是最好的…是的,但不是最好的。总是问自己-wmi如何做到这一点?为什么不直接用这种方式呢?wmi主要用于其他语言,但不用于c/c++(这是我个人的意见)我同意你的看法。我以为你的意思是答案没有用,我误解了。我只是注意到这不是最佳的方式。但是它当然是正确的。使用WMI-从所有可能的最坏的方式,根本不需要它只是另一个(工作)选项,我还没有声称它是最好的一个…是的,但非常不是最佳的。总是问自己-wmi如何做到这一点?为什么不直接用这种方式呢?wmi主要用于其他语言,但不用于c/c++(这是我个人的意见)我同意你的看法。我以为你的意思是答案没有用,我误解了。我只是注意到这不是最佳的方式。但这当然是正确的。
PS Z:\> Get-WmiObject -Query 'Select ExecutablePath From Win32_Process Where ProcessId = 6056'
__GENUS : 2
__CLASS : Win32_Process
__SUPERCLASS :
__DYNASTY :
__RELPATH :
__PROPERTY_COUNT : 1
__DERIVATION : {}
__SERVER :
__NAMESPACE :
__PATH :
ExecutablePath : C:\Program Files (x86)\Moo0\AlwaysOnTop 1.24\WindowMenuPlus64.exe
PSComputerName :
$pinvoke = Add-Type -PassThru -Name pinvoke -MemberDefinition @'
[DllImport("kernel32.dll", SetLastError=true)]
private static extern bool CloseHandle(
IntPtr hObject);
[DllImport("kernel32.dll", SetLastError = true)]
private static extern IntPtr OpenProcess(
uint processAccess,
bool bInheritHandle,
int processId);
[DllImport("kernel32.dll", SetLastError=true)]
private static extern bool QueryFullProcessImageName(
IntPtr hProcess,
int dwFlags,
System.Text.StringBuilder lpExeName,
ref int lpdwSize);
private const int QueryLimitedInformation = 0x00001000;
public static string GetProcessPath(int pid)
{
var size = 1024;
var sb = new System.Text.StringBuilder(size);
var handle = OpenProcess(QueryLimitedInformation, false, pid);
if (handle == IntPtr.Zero) return null;
var success = QueryFullProcessImageName(handle, 0, sb, ref size);
CloseHandle(handle);
if (!success) return null;
return sb.ToString();
}
'@
$pinvoke::GetProcessPath($pid)