Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 30.05.2012, 19:56   #1
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
Вопрос PsAPI. GetProcessImageFileName. Привести LPTSTR к string

Доброго времени суток!


Вопрос по WinAPI. Модераторы, отправьте тему туда.

Разгребаю PsAPI.



пытаюсь написать перебор списка процессов, основываясь на примере.

Есть функция: GetProcessImageFileName

Её почему-то посчитали нужным не обьявить в Windows.PsAPI модуле XE2.

Сделал это сам:
Код:
function GetProcessImageFileName(hProcess:THandle; lpImageFileName:LPTSTR; nSize:DWORD):DWORD; stdcall;
 external 'PSAPI.dll' name 'GetProcessImageFileNameW';
Далее пишу её использование:
Код:
function TProcessForm.GetProcessName(aPID: Cardinal): string;
var
 cProcName:array[0..MAX_PATH] of PChar;
begin
  Result:='';
  if GetProcessImageFileName(aPID,@cProcName,SizeOf(cProcName)) <> 0 then
  begin
    Result:=  << - сюда нужно вернуть string-версию cProcName.
 Привидение типов не работает :( как быть? 
  end;
end;
Правильно ли обьявил эксп. функцию и её использование?
Как вернуть строкой то, что вернулось в массив?

[обновил]

Написал грабли:
Код:
function TProcessForm.GetProcessName(aPID: Cardinal): string;
var
 cProcName:array[0..MAX_PATH] of PChar;
 i:Integer;
 s:string;
begin
  Result:='';
  if GetProcessImageFileName(aPID,@cProcName,SizeOf(cProcName)) <> 0 then
  begin
   for i:=0 to Length(cProcName) do
   begin
     s:=s+cProcName[i];
   end;
    Result:=s;
  end;
end;
Но есть способ проще, однако я его не разгледел. Кто подскажет ?

Последний раз редактировалось Человек_Борща; 30.05.2012 в 23:11.
Человек_Борща вне форума Ответить с цитированием
Старый 30.05.2012, 20:26   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Код:
var s: String;
..
s:=cProcName;

ADD

Только нужно var cProcName:array[0..MAX_PATH] of Char;
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 30.05.2012 в 20:32.
Аватар вне форума Ответить с цитированием
Старый 30.05.2012, 20:38   #3
3D Hunter
Сумрачная тень
Форумчанин
 
Аватар для 3D Hunter
 
Регистрация: 05.03.2009
Сообщений: 689
По умолчанию

Не уверен, попробуйте так:
Код:
function TProcessForm.GetProcessName(const aPID: Cardinal): string;
begin
  Result:='';
  SetLength(Result,MAX_PATH);
  GetProcessImageFileName(aPID,PWideChar(Result),SizeOf(Result));
end;
"ковыряю изнутри" (с)
3D Hunter вне форума Ответить с цитированием
Старый 30.05.2012, 20:41   #4
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Спасибо. с Char сработало. Я в шоке!
Мне вернуло:
\Device\HarddiskVolume1\WINDOWS\sys tem32\lsass.exe

с какого перепугу такие сабжи? кАк сделать привычный вид?
Человек_Борща вне форума Ответить с цитированием
Старый 30.05.2012, 20:42   #5
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Кстати если в Д7, то name 'GetProcessImageFileNameA'

Цитата:
кАк сделать привычный вид?
DevicePathToWin32Path(cProcName) подойдет?
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 30.05.2012 в 20:46.
Аватар вне форума Ответить с цитированием
Старый 30.05.2012, 20:46   #6
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

ага. А по поводу стремных путей к файлам, можно что-то подсказать?
Навскидку:



Мне это кажется совсем лоулевел пути. Мне нужно что-то к юзеру близкое.

Обновлено

Цитата:
The GetProcessImageFileName function returns the path in device form, rather than drive letters. For example, the file name C:\Windows\System32\Ctype.nls would look as follows in device form:

\Device\Harddisk0\Partition1\Window s\System32\Ctype.nls

To retrieve the module name of the current process, use the GetModuleFileName function with a NULL module handle. This is more efficient than calling the GetProcessImageFileName function with a handle to the current process.
А мне нужен путь к чужому процессу.

Последний раз редактировалось Человек_Борща; 30.05.2012 в 21:17.
Человек_Борща вне форума Ответить с цитированием
Старый 30.05.2012, 21:11   #7
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Можно было бы и с DevicePathToWin32Path поработать
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 30.05.2012, 22:18   #8
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

о_О в каком оно модуле?
Человек_Борща вне форума Ответить с цитированием
Старый 30.05.2012, 22:55   #9
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Её нет в модулях. Можно погуглить и найти разные вариации кода на нескольких языках
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 30.05.2012, 23:10   #10
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Обгуглился... но нагуглил! Вопрос закрыт.
Код:
function DevicePathToWin32Path(path:string):string;
var
  c:char;
  s:string;
  i:integer;
  _path : String;
begin
  _path := path;
  i:=posex('\', path, 2);
  i:=posex('\', path, i+1);
  result:=copy(path, i, length(path));
  delete(path, i, length(path));
  for c:='A' to 'Z' do
  begin
    setlength(s, 1000);
    if querydosdevice(pchar(string(c)+':'), pchar(s), 1000)<>0 then
    begin
      s:=pchar(s);
      if sametext(path, s) then
      begin
        result:=c+':'+result;
        exit;
      end;
    end;
  end;
  result := _path;
end;
Человек_Борща вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Графы. Привести пример. MyLastHit Помощь студентам 6 23.09.2011 10:24
LPTSTR записать в ListBox Sheva_ Помощь студентам 0 07.06.2011 13:10
Привести матрицу к единичной lexatigrenok Помощь студентам 1 13.03.2011 18:01
N байт из памяти привести к int64_t Роман Радер Общие вопросы C/C++ 2 11.10.2009 20:18
Привести в живность код student_63 Помощь студентам 1 29.11.2007 02:01