C语言...如何获取进程的可执行文件路径...

C语言...如何获取进程的可执行文件路径...,第1张

hModule=CreateToolhelp32Snapshot(TH32CS_SNAPMODULE,pinfo->th32ProcessID);

Module32First(hModule, minfo); GetShortPathName(minfo->szExePath,shortpath,256);如果还需要详细的代码,请Q我吧。。我最近刚在做这块。。。新手,写的东西比较简单- -

我给你说几个API吧至于程序你自己写吧:1查看进程用到的API:CreateToolhelp32Snapshow:这个函数获得当前系统进程快照。Process32First:获得快照中的第一个进程。Process32Next:遍历系统进程。2获取CPU信息用到的API:NtQuerySystemInformation:这是个Native API哦,使用时要注意的。3获得用户名用NetUserEnum就OK了,具体参数自己查msdn

我觉得这个问题你应该从另外一个方向去考虑,既然b不需要a的资源,那么就不要在fork之前打开这些资源。

你如,你原来的代码是

fd

=

open();

fork();

你现在就应该改成

fork();

if

(parent)

{

fd

=

open();

}

else

{

}

如果你是要在a进程打开资源,运行了一些东西,得到了足够的信息才需要调用其他啊程序来做下一步内容,如果按照上面的方法就无法实现了话,你面对的实际是进程间同步和通信的问题。

解决方法也很简单,随便通过一种通信机制(signal,pipe,等等),等a进程获得足够信息后,再通知b进程执行。比如

a:

fork();

/

below

code

are

running

in

parent,

a

/

fd

=

open();

notify(b);

/

use

kill,

send,

etc

to

notify

child

task

b)

b:

wait();

/

for

example,

while(1)

sleep();

/

execlp(xxx);

通过调用ThreadgetState()方法获取当前线程的状态。以下是我的代码,可以直接编译运行。

public class Test {

public static void main(String[] args) {

new NewThread()start(); //启动线程

}

}

class NewThread extends Thread{

public NewThread() {

super("NewThread"); //定义当前线程的名称为NewThread

}

@Override

public void run() {

Systemoutprintln("当前线程:"+currentThread()getName()+"运行状态为:"+getState()); //打印线程的运行状态

}

}

一、单链表的建立

有了动态内存分配的基础,要实现链表就不难了。

所谓链表,就是用一组任意的存储单元存储线性表元素的一种数据结构。链表又分为单链表、双向链表和循环链表等。我们先讲讲单链表。所谓单链表,是指数据接点是单向排列的。一个单链表结点,其结构类型分为两部分:

1、数据域:用来存储本身数据

2、链域或称为指针域:用来存储下一个结点地址或者说指向其直接后继的指针。

例:

typedef strUCt node

{

char name[20];

struct node link;

}stud;

这样就定义了一个单链表的结构,其中char name[20]是一个用来存储姓名的字符型数组,指针link是一个用来存储其直接后继的指针。

定义好了链表的结构之后,只要在程序运行的时候爱数据域中存储适当的数据,如有后继结点,则把链域指向其直接后继,若没有,则置为NULL。

下面就来看一个建立带表头(若未说明,以下所指链表均带表头)的单链表的完整程序。

#include <stdioh>

#include <malloch> /包含动态内存分配函数的头文件/

#define N 10 /N为人数/

typedef struct node

{

char name[20];

struct node link;

}stud;

stud creat(int n) /建立单链表的函数,形参n为人数/

{

stud p,h,s; / h保存表头结点的指针,p指向当前结点的前一个结点,s指向当前结点/

int i; /计数器/

if((h=(stud )malloc(sizeof(stud)))==NULL) /分配空间并检测/

{

PRintf("不能分配内存空间!");

exit(0);

}

h->name[0]='\0'; /把表头结点的数据域置空/

h->link=NULL; /把表头结点的链域置空/

p=h; /p指向表头结点/

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

{

if((s= (stud ) malloc(sizeof(stud)))==NULL) /分配新存储空间并检测/

{

printf("不能分配内存空间!");

exit(0);

}

p->link=s; /把s的地址赋给p所指向的结点的链域,这样就把p和s所指向的结点连接起来了/

printf("请输入第%d个人的姓名",i+1);

scanf("%s",s->name); /在当前结点s的数据域中存储姓名/

s->link=NULL;

p=s;

}

return(h);

}

main()

{

int number; /保存人数的变量/

stud head; /head是保存单链表的表头结点地址的指针/

number=N;

head=creat(number); /把所新建的单链表表头地址赋给head/

}

这样就写好了一个可以建立包含N个人姓名的单链表了。写动态内存分配的程序应注重,请尽量对分配是否成功进行检测。

引用自:>

用进程快照是可以的,以下代码你自己看着选你所需

void CLoaderDlg::UpdateProcessList()

{

UpdateData(TRUE);

m_ProcListDeleteAllItems();

MYHOOKSTRUCT ProcHookArry[20];

memset(ProcHookArry,0,20sizeof(MYHOOKSTRUCT));

int nCount = 0;

CString str="";

//Second=1;

PROCESSENTRY32 pe32;//进程信息结构体

pe32dwSize = sizeof(pe32);//必须先填充大小。

HANDLE hProcessSnap = ::CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);

if(hProcessSnap == INVALID_HANDLE_VALUE)

{

MessageBox("CreateToolhelp32Snapshot调用失败","Warning");

return;

}

BOOL bMore = ::Process32First(hProcessSnap,&pe32);

while(bMore)

{

//注意:当列表框控件中选中了排序(sort)时会出现ID与程序名不一致。

if(strcmp(strupr(pe32szExeFile),"NOTEPADEXE")==0)

{

ProcHookArry[nCount]ProcessID=pe32th32ProcessID;

ProcHookArry[nCount]ThreadID=GetThreadId(pe32th32ProcessID);

ProcHookArry[nCount]hWnd=myGetWindowByProcessId(pe32th32ProcessID);

strcpy(ProcHookArry[nCount]Name,pe32szExeFile);

ProcHookArry[nCount]hHook=0;

ProcHookArry[nCount]HookFlag=0;

nCount++;

}

bMore = ::Process32Next(hProcessSnap,&pe32);

}

::CloseHandle(hProcessSnap);

for(int i=0;i<nCount;i++)

{

for(int j=0;j<m_HookArryLen;j++)

{

if(ProcHookArry[i]ThreadID==m_ProcHookArry[j]ThreadID)

{

ProcHookArry[i]hHook=m_ProcHookArry[j]hHook;

ProcHookArry[i]hWnd=m_ProcHookArry[j]hWnd;

ProcHookArry[i]ProcessID=m_ProcHookArry[j]ProcessID;

ProcHookArry[i]HookFlag=m_ProcHookArry[j]HookFlag;

strcpy(ProcHookArry[i]Name,m_ProcHookArry[j]Name);

break;

}

}

}

memcpy(m_ProcHookArry,ProcHookArry,nCountsizeof(MYHOOKSTRUCT));

m_HookArryLen=nCount;

int index=0;

for(int n=0;n<m_HookArryLen;n++)

{

strFormat("%d",m_ProcHookArry[n]ThreadID);

index=m_ProcListGetItemCount();

m_ProcListInsertItem(index,str);

m_ProcListSetItemText(index,1,m_ProcHookArry[n]Name);

if(m_ProcHookArry[n]HookFlag)

{

str="已加载";

m_ProcListSetItemText(index,2,str);

}

else

{

str="未加载";

m_ProcListSetItemText(index,2,str);

}

char buf[100]={0};

::GetWindowText(m_ProcHookArry[n]hWnd,buf,100);

str=buf;

m_ProcListSetItemText(index,3,str);

//::SendMessage(m_ProcHookArry[n]hWnd,WM_CLOSE,0,0);

}

UpdateData(FALSE);

}

以上就是关于C语言...如何获取进程的可执行文件路径...全部的内容,包括:C语言...如何获取进程的可执行文件路径...、用C或C++程序编写可以查看window进程,CPU,用户名(没分了,大家帮帮忙啊)、使用linux编写C语言程序,如何才能得到进程信息和父进程信息等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

原文地址: http://outofmemory.cn/web/9722570.html

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

发表评论

登录后才能评论

评论列表(0条)

保存