VC中有直接获得当前进程名的函数吗

VC中有直接获得当前进程名的函数吗,第1张

VC中使用GetModuleFileName()函数来获取当前应用程序路径。具体实现代码如下:

CString

g_AppPath;

char

cIniFileName[MAX_PATH];

GetModuleFileName(NULL,cIniFileName,sizeof(cIniFileName))

;

char

p

=

strrchr(cIniFileName,'\\')

;

g_AppPathFormat("%s",cIniFileName);

其中MAX_PATH是系统的一个

宏定义

,表示数组最长长度,为260。

linux获取进程id和进程名称作为一个共享库,应该需要统计使用本库的各种应用程序的使用频率,使用方法等信息。才能针对主要应用做出更好的改进。

>

首先说说DIR这一结构体,以下为DIR结构体的定义:

struct __dirstream

{

void __fd;

char __data;

int __entry_data;

char __ptr;

int __entry_ptr;

size_t __allocation;

size_t __size;

__libc_lock_define (, __lock)

};

typedef struct __dirstream DIR;

DIR结构体类似于FILE,是一个内部结构,以下几个函数用这个内部结构保存当前正在被读取的目录的有关信息(摘自《UNIX环境高级编程(第二版)》)。函数 DIR opendir(const char pathname),即打开文件目录,返回的就是指向DIR结构体的指针,而该指针由以下几个函数使用:

struct dirent readdir(DIR dp);

void rewinddir(DIR dp);

int closedir(DIR dp);

long telldir(DIR dp);

void seekdir(DIR dp,long loc);

关于DIR结构,我们知道这么多就可以了,没必要去再去研究他的结构成员。

接着是dirent结构体,首先我们要弄清楚目录文件(directory file)的概念:这种文件包含了其他文件的名字以及指向与这些文件有关的信息的指针(摘自《UNIX环境高级编程(第二版)》)。从定义能够看出,dirent不仅仅指向目录,还指向目录中的具体文件,readdir函数同样也读取目录下的文件,这就是证据。以下为dirent结构体的定义:

struct dirent

{

long d_ino; / inode number 索引节点号 /

off_t d_off; / offset to this dirent 在目录文件中的偏移 /

unsigned short d_reclen; / length of this d_name 文件名长 /

unsigned char d_type; / the type of d_name 文件类型 /

char d_name [NAME_MAX+1]; / file name (null-terminated) 文件名,最长255字符 /

}

然后是怎么使用它读取进程信息。可以用这些函数来读取/proc下的文件夹,然后做一个判断,只要文件夹的名字开头是1-9的,就进入目录读取其中的status文件,然后输出信息。

代码

#include <stdioh>

#include <direnth>

#include <unistdh>

#include <stdlibh>

typedef struct{

pid_t pid;

char name[256];//进程名称

int vmsize;//虚拟内存信息

}proc_info_st;//保存读取的进程信息

#define PROC_NAME_LINE 1//名称所在行

#define PROC_PID_LINE 4//pid所在行

#define PROC_VMSIZE_LINE 12//虚拟内存所在行

#define BUFF_LEN 1024 //行缓冲区的长度

#ifndef TRUE

# define TRUE 1

#endif

#ifndef FALSE

# define FALSE 0

#endif

void read_proc(proc_info_st info,const char c_pid);//读取进程信息

int read_line(FILE fp,char buff,int b_l,int l);//读取一行

int main()

{

//打开目录

DIR dir;

struct dirent ptr;

if (!(dir = opendir("/proc")))

return 0;

//读取目录

while (ptr = readdir(dir))

{//循环读取出所有的进程文件

if (ptr->d_name[0] > '0' && ptr->d_name[0] <= '9')

{

//获取进程信息

proc_info_st info;

read_proc(&info,ptr->d_name);//读取信息

printf("pid:%d\npname:%s\nvmsize:%d\n",infopid,infoname,infovmsize);

printf("\n\n");//再空两行

}

}

}

/

说明:根据进程pid获取进程信息,存放在proc_info_st结构体中

输入:

/proc_info_st info 返回进程信息

/char c_pid 进程pid的字符串形式

/

void read_proc(proc_info_st info,const char c_pid)

{

FILE fp = NULL;

char file[512] = {0};

char line_buff[BUFF_LEN] = {0};//读取行的缓冲区

sprintf(file,"/proc/%s/status",c_pid);//读取status文件

if (!(fp = fopen(file,"r")))

{

printf("read %s file fail!\n",file);

return;

}

char name[32];

//先读取进程名称

if (read_line(fp,line_buff,BUFF_LEN,PROC_NAME_LINE))

{

sscanf(line_buff,"%s %s",name,(info->name));

}

fseek(fp,0,SEEK_SET);//回到文件头部

//读取进程pid

if (read_line(fp,line_buff,BUFF_LEN,PROC_PID_LINE))

{

sscanf(line_buff,"%s %d",name,&(info->pid));

}

fseek(fp,0,SEEK_SET);//回到文件头部

//读取进程vmsize

if (read_line(fp,line_buff,BUFF_LEN,PROC_VMSIZE_LINE))

{

sscanf(line_buff,"%s %d",name,&(info->vmsize));

}

fclose(fp);

}

/

说明:读取文件的一行到buff

输入:

/FILE fp 文件指针

/char buff 缓冲区

/int b_l 缓冲区的长度

/l 指定行

输出:

/true 读取成功

/false 读取失败

/

int read_line(FILE fp,char buff,int b_l,int l)

{

if (!fp)

return FALSE;

char line_buff[b_l];

int i;

//读取指定行的前l-1行,转到指定行

for (i = 0; i < l-1; i++)

{

if (!fgets (line_buff, sizeof(line_buff), fp))

{

return FALSE;

}

}

//读取指定行

if (!fgets (line_buff, sizeof(line_buff), fp))

{

return FALSE;

}

memcpy(buff,line_buff,b_l);

return TRUE;

}

如果你想更深入的了解一些东西可以参考下>

DWORD PID;

PID = GetProcessPID(L"testexe");

//获取进程pid函数

DWORD GetProcessPID(LPCTSTR pName)

{

HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);

if (INVALID_HANDLE_VALUE == hSnapshot) {

return NULL;

}

PROCESSENTRY32 pe = { sizeof(pe) };

BOOL fOk;

for (fOk = Process32First(hSnapshot, &pe); fOk; fOk = Process32Next(hSnapshot, &pe)){

if (!_tcsicmp(peszExeFile, pName)) {

CloseHandle(hSnapshot);

return peth32ProcessID;

}

}

return NULL;

}

//由进程pid获取进程句柄,置顶

HWND hh = GetProcessTopWindows(PID);

HWND GetProcessTopWindows(DWORD dwPID){

count = 0;

EnumWindows((WNDENUMPROC)EnumWndProc, (LPARAM)dwPID);

if(count > 0) {

//cout << "窗口句柄是:" << nhWnd[count -1] << endl;//输出句柄,可用spy++工具核对

return (nhWnd[count -1]);

}

return NULL;

}

别忘了添加对应头文件。

以上就是关于VC中有直接获得当前进程名的函数吗全部的内容,包括:VC中有直接获得当前进程名的函数吗、linux获取进程id和进程名称、Linux下怎么读取多个进程的信息等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

原文地址:https://54852.com/web/10147894.html

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

发表评论

登录后才能评论

评论列表(0条)

    保存