VC 如何根据进程名称找程序的目录

VC 如何根据进程名称找程序的目录,第1张

你首先需要为VC下载一个Microsoft

Platform

SDK

for

Windows

XP

SP2,有了这个包以后,将psapi.h和psapi.lib拷贝到VC的include和lib目录,采用PSAPI编程:

1、用EnumProcesses函数列出当前所有进程

2、用OpenProcess打开进程

3、用GetProcessImageFileName函数就可以获取程序的完整目录

上面三个函数的资料在互联网上很培行宴完整,你可以用函数名作为关键字搜索一下就知道了。

下面举个例子:

#include

<windows.h>

#include

<stdio.h>

#include

<tchar.h>

#include

<psapi.h>

#pragma

comment(lib,

"psapi.lib")

void

PrintProcessNameAndID(

DWORD

processID

)

{

TCHAR

szProcessName[MAX_PATH]

=

TEXT("<unknown>")

TCHAR

szProcessPath[MAX_PATH]

=

TEXT("<unknown>")

//

获取进程句柄

HANDLE

hProcess

=

OpenProcess(

PROCESS_QUERY_INFORMATION

|

PROCESS_VM_READ,

FALSE,

processID

)

//

获取进程名称和路径

if

(NULL

!=

hProcess

)

{

HMODULE

hMod

DWORD

cbNeeded

if

(

EnumProcessModules(

hProcess,

&hMod,

sizeof(hMod),

&cbNeeded)

)

{

GetModuleBaseName(

hProcess,

hMod,

szProcessName,

sizeof(szProcessName)/sizeof(TCHAR)

)

}

GetProcessImageFileName(hProcess,

szProcessPath,

MAX_PATH)

}

//

打印进程名、进程号和路径地址.

_tprintf(

TEXT("%s

(PID:

%u)

<%s>\n"),

szProcessName,

processID,

szProcessPath

)

CloseHandle(

hProcess

)

}

void

main(

)

{

//

获取带闹进程列表.

DWORD

aProcesses[1024],

cbNeeded,

cProcesses

unsigned

int

i

if

(

!EnumProcesses(

aProcesses,

sizeof(aProcesses),

&cbNeeded

)

)

return

//

计算当前一共多少个配银活动进程

cProcesses

=

cbNeeded

/

sizeof(DWORD)

//打印进程信息

for

(

i

=

0

i

<

cProcesses

i++

)

if(

aProcesses[i]

!=

0

)

PrintProcessNameAndID(

aProcesses[i]

)

}

#include <iostream>

#include <windows.h> // 这个必须要有 

#include <string> // 字符串处理函数 

using namespace std

int main() {

    char szFileName[256] = "" // 待会存完整路径 

    string strAnotherExe = "pipe.exe" // 要执行的另外一个exe的名称 

    

    // 获得程序的运行路径,包含本程序名 

    GetModuleFileNameA(NULL, szFileName, 256)

    string strFileName = szFileName // 用string处理比较方便

    

    // 删掉本程序名轮谈芦,只保留路径

    size_t slashIndex = strFileName.rfind('\\')

    strFileName.erase(slashIndex+1)

    

    // 拼接要启动的程序的完整文件名

    strFileName += strAnotherExe

    cout<<"Another exe path : "<<strFileName<<endl

    

    // 在当前程序中启动外部程序,输出会进入本程序

    //system(strFileName.c_str()) 

    // 在新的窗口中打开外部程序

    strFileName = "start "+strFileName

    system(strFileName.c_str())

    

    return 0

}

主要思路是GetModuleFileNameA获得程序运行时的绝对路径,包含程序侍念名。

因此只要删掉程序名,然后拼接上另外的一个程序名就可以了。

用system("程序名")可以启动一个子进程,然后主进程卡在system处,等子进程结束,主进程才继续往下走。

用system("start 程序名")可以在新窗口中打开进程,不等子进程结束,主进程就继续往下走。

PS:如果编译器提示没有system函数,请包含stdlib.h头文腊带件。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12449388.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-25
下一篇 2023-05-25

发表评论

登录后才能评论

评论列表(0条)

保存