首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > .NET >

获取进程名不全!怎么解决?

2012-03-12 
获取进程名不全!!!如何解决??各位同行:  我用以下代码来获取程序AFilename在系统中的进程ID值。但是我发现

获取进程名不全!!!如何解决??
各位同行:
  我用以下代码来获取程序AFilename在系统中的进程ID值。但是我发现文件名短的如   crss.exe就可以找到其ID号,但长一点的如我的程序名是testclientpc_dll.exe   却找不到其ID号,通过调试发现原来在进程列表中只能显示出   testclientpc_dl,这样通过比较当然不会找到了。
  如何在进程列表中显示出完整的程序名称????
  不知道各位是如何解决这个问题的。

代码如下:

{   列举进程   }
//AFilename:   要获取进程ID的软件名。
//PathMatch:   匹配方式;False:只是文件名;   True:文件的绝对名称(绝对路径+文件名)
//ProcessID:   进程ID返回值。
procedure   J_GetProcessID(const   AFilename:   string;   const   PathMatch:   Boolean;   var   ProcessID:   DWORD);
var
                lppe:   TProcessEntry32;
                SsHandle:   Thandle;
                FoundAProc,   FoundOK:   boolean;
                ss:string;
begin

                ProcessID   :=0;
                {   创建系统快照   }
                SsHandle   :=   CreateToolHelp32SnapShot(TH32CS_SnapProcess,   0);
               
                try
                                {   取得快照中的第一个进程   }
                                {   一定要设置结构的大小,否则将返回False   }
                                lppe.dwSize   :=   sizeof(TProcessEntry32);
                                FoundAProc   :=   Process32First(Sshandle,   lppe);
                                while   FoundAProc   do
                                begin
                                                ss:=   lppe.szExefile;   //!!!问题就出在这里:AFilename是testclientpc_dll.exe;但lppe.szExefile=testclientpc_dl   !!!

                                                {   进行匹配   }
                                                if   PathMatch   then
                                                                FoundOK   :=   AnsiStricomp(lppe.szExefile,   PChar(AFilename))   =   0
                                                else
                                                                FoundOK   :=   AnsiStricomp(PChar(ExtractFilename(lppe.szExefile)),   PChar(ExtractFilename



(AFilename)))   =   0;

                                                if   FoundOK   then
                                                begin
                                                                ProcessID   :=   lppe.th32ProcessID;
                                                                break;
                                                end;

                                                {   未找到,继续下一个进程   }
                                                FoundAProc   :=   Process32Next(SsHandle,   lppe);
                                                application.ProcessMessages;//
                                end;
                finally
                                CloseHandle(SsHandle);
                end;
end;




[解决办法]
我前一阵写了个程序,刚才测试了一下,的确有这个问题,WINDOWS的任务管理器也一样,说明CreateToolHelp32SnapShot这个函数有缺陷,也就是说,光利用进程快照,就会出现对长文件名、中文文件名出现获取错误现象。

不过这个问题可以解决,还是用CreateToolHelp32SnapShot函数,获取进程的模块快照,第一个模块就是主进程,这个名字是正确的。

热点排行