各位同行:
  我用以下代码来获取程序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;

解决方案 »

  1.   

    procedure tform1.J_GetProcessID;
    var
            lppe: TProcessEntry32;
            SsHandle: Thandle;
            FoundAProc, FoundOK: boolean;
            ss:pchar;//注意pchar型
    begin
    { 创建系统快照 }
    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 !!!
    memo1.Lines.Add(strpas(ss));
    FoundAProc := Process32Next(SsHandle, lppe);
    application.ProcessMessages;//
    end;
      finally
             CloseHandle(SsHandle);
            end;
    end;
    代码在DELPHI6中调试通过楼主试试!
      

  2.   

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

  3.   

    看看我的程序截图吧。http://p.blog.csdn.net/images/p_blog_csdn_net/%e5%bf%ab%e4%b9%90%e8%80%81%e7%8c%ab/279033/o_Snap1.jpg