得到进程Handle后可这样子:
//uses JwaPsApi; // 如果没有这个单元文件,可以到jedi那里下一个。
//var Process: Cardinal;
//var Modules: array[0..255] of Cardinal;
//var NeededSize: Cardinal;
    if EnumProcessModules(Process, @Modules, SizeOf(Modules), NeededSize) then
    begin
      for I := 0 to NeededSize div SizeOf(Cardinal) do
      begin
        if GetModuleFileNameEx(Process, Modules[I], @FileName, SizeOf(FileName)) <> 0 then
          Memo1.Lines.Add(FileName);
      end;
    end;
//似乎一般情况下数组里的最后一个才是应用程序的文件名

解决方案 »

  1.   

    补充一点,这个在WinNT/2000/XP下才有效,
    win9x下我还没发现什么好办法可以得到它的路径及文件名
      

  2.   

    function GetLongPathName(const ShortName : string) : string; 
    var
      pcBuffer: PChar;
      iHandle, iLen : Integer;
      GetLongPathName: function (ShortPathName: PChar; LongPathName: PChar;
                                 cchBuffer: Integer): Integer stdcall; 
    begin
      Result := ShortName;
      iHandle := GetModuleHandle('kernel32.dll');
      if (iHandle <> 0) then begin
        @GetLongPathName := GetProcAddress(iHandle, 'GetLongPathNameA');
        if Assigned(GetLongPathName) then begin
          pcBuffer := StrAlloc(MAX_PATH + 1);
          iLen := GetLongPathName(PChar(ShortName), pcBuffer, MAX_PATH);
          // 如果 result = 0 : 转换失败
          // 如果 result > MAX_PATH ==> 转换失败, 缓冲区不够大
          if (iLen > 0) and (iLen <= MAX_PATH) then begin
            Result := StrPas(pcBuffer);
          end; // 如果 (iLen <= MAX_PATH) 那么
          StrDispose(pcBuffer);
        end; // 如果 Assigned(GetLongPathName) 那么
        FreeLibrary(iHandle);
      end; // 如果 (iHandle <> 0) 那么 
    end;