C语言得到一个进程的进程号,在windows VC++上得到父进程ID的方法,求····

C/C++ code#include

#include

#include

#include

void PrintModules( DWORD processID )

{

HMODULE hMods[1024];

HANDLE hProcess;

DWORD cbNeeded;

unsigned int i;

// Print the process identifier.

printf( "\nProcess ID: %u\n", processID );

// Get a list of all the modules in this process.

hProcess = OpenProcess( PROCESS_QUERY_INFORMATION |

PROCESS_VM_READ,

FALSE, processID );

if (NULL == hProcess)

return;

if( EnumProcessModules(hProcess, hMods, sizeof(hMods), &cbNeeded))

{

for ( i = 0; i < (cbNeeded / sizeof(HMODULE)); i++ )

{

TCHAR szModName[MAX_PATH];

// Get the full path to the module's file.

if ( GetModuleFileNameEx(hProcess, hMods[i], szModName,

sizeof(szModName)/sizeof(TCHAR)))

{

// Print the module name and handle value.

_tprintf(TEXT("\t%s (0x%08X)\n"),

szModName, hMods[i]);

}

}

}

CloseHandle( hProcess );

}

void main( )

{

// Get the list of process identifiers.

DWORD aProcesses[1024], cbNeeded, cProcesses;

unsigned int i;

if ( !EnumProcesses( aProcesses, sizeof(aProcesses), &cbNeeded ) )

return;

// Calculate how many process identifiers were returned.

cProcesses = cbNeeded / sizeof(DWORD);

// Print the name of the modules for each process.

for ( i = 0; i < cProcesses; i++ )

PrintModules( aProcesses[i] );

}

------解决方案--------------------

windows下子进程跟父进程之间的关系本事就是没什么关联的,不像Linux,windows也没有直接一个API可以得到父进程的ID,可以参考 http://www.cnblogs.com/login007/archive/2011/09/02/2163468.html

------解决方案--------------------

前段时间刚好用到C/C++ codeDWORD GetParentProcessID(DWORD dwProcessId)

{

LONG status;

DWORD dwParentPID = (DWORD)-1;

HANDLE hProcess;

PROCESS_BASIC_INFORMATION pbi;

PROCNTQSIP NtQueryInformationProcess = (PROCNTQSIP)GetProcAddress(

GetModuleHandle(L"ntdll"), "NtQueryInformationProcess");

if(NULL == NtQueryInformationProcess)

{

return (DWORD)-1;

}

// Get process handle

hProcess = OpenProcess(PROCESS_QUERY_INFORMATION,FALSE, dwProcessId);

if (!hProcess)

{

return (DWORD)-1;

}

// Retrieve information

status = NtQueryInformationProcess( hProcess,

ProcessBasicInformation,

(PVOID)&pbi,

sizeof(PROCESS_BASIC_INFORMATION),

NULL

);

// Copy parent Id on success

if (!status)

{

dwParentPID = pbi.InheritedFromUniqueProcessId;

}

CloseHandle (hProcess);

return dwParentPID;

}

------解决方案--------------------探讨

3K~~我也用你这种方法试了,但是我得到的父进程的ID好像不是我需要的Id,比如我产生的可执行文件为mytool,如果我在编译器VC++中运行mytool,则它的父进程id显示的是编译器的id,如果是直接双击运行mytool,则父进程id显示是explorer.exe的id?

但是在linux下,我用getpid()和getppid()得到的id和它的父进程id分别是mytool和/tools/cad/cds/ies/8.2/IUS82/tools/systemc/bin/gdb64 -q -fullname mytool的id,所以linux和windows下得到的感觉不一样?能帮我解决一下吗? 搞不懂啊~~~~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值