var
  Buffer: array[0..MAX_PATH] of WideChar;
  name: string;
  handle: THandle;
begin
  handle := OpenProcess(PROCESS_ALL_ACCESS, False, PID号);
  SetString(name, Buffer, GetModuleFileName(handle, Buffer, Length(Buffer)));
  ShowMessage(name);
end;显示出来怎么是乱码?

解决方案 »

  1.   

    array[0..MAX_PATH] of Char; 
      

  2.   

    另外不要用 Length 对数组操作。用 sizeof(buff)/sizeof(buff[0])。或者在已知上下文的情况下,直接用 MAX_PATH
      

  3.   

    var
      Buffer: array[0..MAX_PATH] of Char;
      handle: THandle;
    begin
      FillChar(buffer, sizeof(buffer), #0);  
      // 这里如果不是必须,没必要 ALL_ACCESS,在某些情况下,ALL_ACCESS 可能被拒绝
      handle := OpenProcess(PROCESS_ALL_ACCESS, False, PID号);
      if (INVALID_HANDLE_VALUE <> handle)
      begin
          GetModuleFileName(handle, Buffer, MAX_PATH);
          CloseHandle(handle);
      end;
      ShowMessage(buffer);
    end; 
      

  4.   

    试了一下,不行,showmessage显示一个空的。
      

  5.   

    这个 GetModuleFileName 的第一个参数传的真是太有创意了
      

  6.   

    我靠,2楼的高手能不能讲讲为啥不能用 Length 呢
      

  7.   

    问题解决,代码如下:
    var
      Buffer: array[0..MAX_PATH] of WideChar;
      name: string;
      hMod: HMODULE;
      cbNeeded, hProcess: DWORD;
    begin
      EnumProcessModules(进程句柄, @hMod, sizeof(hMod), cbNeeded);
      SetString(name, Buffer, GetModuleFileNameEx(进程句柄, hMod, Buffer, Length(Buffer)));
      ShowMessage(Buffer);
    end;知道进程PID,取进程句柄就不难了。非常感谢Adayuer的热心,今天一连答了我好几个问题,再次感谢。
      

  8.   

    最后一行错了,是ShowMessage(name); 删掉Name,不用Buffer填充name,直接ShowMessage(Buffer)也行。
      

  9.   

    Length 支持数组。 只是觉得这样不太好。 
      

  10.   

    procedure TForm1.Button1Click(Sender: TObject);
    var
      Buffer: array[0..MAX_PATH] of Char;
      handle: THandle;
    begin
      FillChar(buffer, sizeof(buffer), #0);
      // 这里如果不是必须,没必要 ALL_ACCESS,在某些情况下,ALL_ACCESS 可能被拒绝
      handle := OpenProcess(PROCESS_ALL_ACCESS, False, 1412);
      if (INVALID_HANDLE_VALUE <> handle) then
      begin
          GetModuleFileName(handle, Buffer, MAX_PATH);
          CloseHandle(handle);
      end;
      ShowMessage(buffer);
    end;end.
    我这里怎么还显示空呢?
      

  11.   

    GetModuleFileName的第一个参数不是一个句柄,而是一个HMODULE。参考7楼代码
      

  12.   

    重新精简代码取已知句柄的进程名字:
    var 
      Buffer: array[0..MAX_PATH] of WideChar; 
      name: string;
    begin 
      SetString(name, Buffer, GetModuleFileNameEx(进程句柄, 0, Buffer, Length(Buffer))); 
      ShowMessage(name); 
    end;