ProcessPath — Процедура Delphi

Содержание

ProcessPath — Процедура Delphi

Внимание! Эти функции работают со строками, представляющими из себя имена файлов. И результы их работы — тоже строки. Физически с файлами они ничего не делают.

Таблица стандартных процедур и функций для работы с именами файлов
Наименование Описание
ChangeFileExtention функция Изменяет расширение файла.
DosPathToUnixPath функция Конвертирует путь, заданный в спецификации DOS в путь по спецификации Unix.
ExcludeTrailingBackslash функция Возвращает путь без символов разделителей пути («\» — для Windows и «/» — для Linux). Эта функция включена для совместимости со старыми версиями. Новые программы должны использовать ExcludeTrailingPathDelimiter.
ExcludeTrailingPathDelimiter функция Возвращает путь без символов разделителей пути («\» — для Windows и «/» — для Linux).
ExpandFileName функция Возвращает полный путь для имени файла, заданного относительно, без учета регистра.
ExpandFileNameCase функция Возвращает полный путь для имени файла, заданного относительно, с учетом регистра.
ExpandUNCFileName функция Возвращает полный путь для имени файла в формате Universal Naming Convention для сетевых файлов, если это возможно.
ExtractFileDir функция Возвращает полное (включая имя диска) имя дирректории, в которой расположен файл.
ExtractFileDrive функция Возвращает имя диска.
ExtractFileExt функция Возвращает расширение файла.
ExtractFileName функция Возвращает имя файла с расширением.
ExtractFilePath функция Возвращает полный путь к файлу.
ExtractRelativePath функция Возвращает относительное имя файла относительно заданной базовой директории.
ExtractShortPathName функция Конвертирует полное имя файла в короткую 8.3 форму. Например: «C:\Program Files\MyCompany\MyApp\MyApp.exe» будет преобразовано в «C:\Progra

1\MyApp\MyApp.exe».

IncludeTrailingBackslash функция Включает в путь символы разделителей пути («\» — для Windows и «/» — для Linux). Эта функция включена для совместимости со старыми версиями. Новые программы должны использовать IncludeTrailingPathDelimiter.
IncludeTrailingPathDelimiter функция Включает в путь символы разделителей пути («\» — для Windows и «/» — для Linux).
IsPathDelimiter функция Показывает являектся ли символ в указазанной позиции символом разделителя пути («\» — для Windows и «/» — для Linux).
MatchesMask функция Показывает удовлетворяет ли конкретное имя файла формату, заданному в маске.
MinimizeName функция Укорачивает полное имя файла так, чтобы оно поместилось в ограниченную область вывода. Если полное имя файла превышает область вывода, MinimizeName заменяет часть пути точками так, чтобы имя файла вписалось в заданные рамки.
ProcessPath процедура Раскладывает полное имя файла по полочкам, вычленяя: имя диска, путь к файлу, короткое имя файла с расширением.
UnixPathToDosPath функция Конвертирует путь, заданный в спецификации Unix в путь по спецификации DOS.

Список литературы:

  1. Delphi7 Help

Процедуры Delphi

В процессе программирования на языке Delphi, как и на любом другом языке программирования, основная задача программиста состоит в том, чтобы разработать процедуры (подпрограммы) для обработки определенных событий. Как только это событие возникло, проводится автозапуск процедуры обработки события (если возникло соответствующее событие, Delphi осуществляет вызов процедуры обработки возникшего события). Именно эту процедуру разработчик программы и должен описать.

Главное отличие процедуры от функции состоит в том, что есть связь между именем функции и значением. Таким образом, возможно использование имени функции в разнообразных выражениях. Организация процедуры Delphi по сути ничем не отличается от организации функции.

Как и для функции, в начале каждой процедуры указывают ее заголовок. Затем называют эту процедуру каким-нибудь именем. После имени в скобках следует перечень параметров, заканчивающийся символом «;» и потом уже описывают разделы констант, типов, переменных и инструкций.

Общий вид процедуры Delphi:

Общий вид процедуры Delphi выглядит следующим образом:

В приведенном выше примере, как мы видим, в состав заголовка процедуры сначала входит служебное словоprocedure. Далее за этим ключевым словом следом располагается имя процедуры, использующееся при вызове процедуры, обеспечивая активизацию ее выполнения.

Если процедура обладает какими-либо параметрами, то программист их указывает в скобках, сразу после имени процедуры. В конце заголовка процедуры ставится символ «;». В случае, когда в процедуре имеются именованные константы, программист объявляет их в разделеconst.

Далее за этим разделом идет раздел type, использующийся для объявления типов. После располагается раздел var, содержащий все переменные, которые впоследствии программист использует в своей программе. Затем следует раздел инструкций , которые включает в себя исполняемые инструкции данной процедуры.

Примеры процедуры Delphi:

Приведем пример процедуры Delphi, вычисляющей стоимость некоторой покупки:

Vcl.FileCtrl.ProcessPath

Properties

Description

Parses a file name into its constituent parts.

Call ProcessPath to parse a file name into its drive, path, and file name.

Pass the full file name that should be parsed as the EditText parameter. EditText must refer to an existing file or directory name.

ProcessPath returns the indicated drive, directory, and file name as the Drive, DirPart, and FilePart parameters.

Работа с процессами в Windows. Модуль PsAPI.pas

Вообще заинтересоваться темой работой с процессами в Windows XP меня заставило не любопытство, а острая необходимость решения мелкой, но очень нехорошей проблемы.

Началось всё с того, что моя жена блуждая по просторам Рунета, приволокла в свой комп нехороший вирус. Не знаю какое уж название прилепил этому вирусу Касперский, н согласно его методам именования, но вирус, мягко говоря козлячий. Смысл его работы заключался в следующем: примерно через 1-2 минуты после запуска ОС на рабочем столе появлялось окно с сообщением, типа «Тестовый период использования программы … закончился. Отошлите СМС на номер … » и до кучи предупреждение о том, что не стоит вмешиваться работы системы иначе будет мега-коллапс. В общем развод на денюжки гордых пользователей нелегального софта честных граждан. Проблемка заключалась в том, что окно это висело аккурат по центру рабочего стола, поверх всех окон и напрочь отказывалось сменить свое положение, т.е. просто так взять и запустить диспетчер задач было нереально (кстати, он и не помог бы особо в решении проблемы). В безопасном режиме — то же самое.

Делать нечего — пошел Гуглить на тему как с этой гадостью бороться. Как оказалось вирь этот уже имел тучу модификаций и скрывался в разных файлах системы. Как назло у меня оказалась последняя модификация. Как вариант, на одном из форумов нашел совет по «ручному» обезвреживанию — как-нибудь убить процесс winlogon.exe (в нем скрывалось жирное, безобразное тело вируса), скачать скрипт (прилагался) и выполнить его, тем самым убив файлы вируса пока тот отключен.

Если кто не в курсе — winlogon.exe средствами Windows просто так не убить. Обычно убийство заканчивается сообщением:

Вот тут и началось мое ускоренное изучение работы с процессами в Windows XP. И первая задача, которая передо мной встала — узнать имена всех запущенных процессов в Windows. И тут нам как нельзя кстати пригодиться модуль PsAPI.pas.

Назначение PsAPI (Process status Application Programming Interface): вспомогательная библиотека, облегчающая доступ к информации о запущенных процессах и драйверах системы.

Открываем Delphi, создаем новый проект и подключаем в uses модуль psapi. Теперь открываем сам модуль и смотрим, что он нам может предложить:

Get list of all runing processes (with processName+ProcessPath+ProcessTitle) [closed]

Want to improve this question? Add details and clarify the problem by editing this post.

Closed 5 years ago .

what i’am trying to do:

get list of all runing processes with: processName (without .exe ) ProcessFullFilePath ProcessMainWindowTitle something like:

Very important: i need working code that will not make any exception( try catch )

My Code:
i used TLHelp32 to get list of the names:

it’s not enough, i need: name path title

1 Answer 1

This function is no good:

The problem is that data.szExeFile[i] <> » always evaluates True . That is because data.szExeFile[i] is a single character of type char , and » is the empty string which is never equal to a single character.

In fact you can implement GetName like this:

You do also need to initialise data before you call Process32First as described in the documentation. You need to write:

before you call Process32First .

Here is a debugged version of your program:

Note that this will not give you the full path to the executable file. To get the full path you need to use GetModuleFileNameEx . That in turn needs a process handle which you get from the process ID by calling OpenProcess . And the process ID is found in the TProcessEntry32 record.

As for the main window title, that’s more tricky. Many processes will not have a main window. What’s more even those that do, how to you know which window is the main window? A process may have multiple top level windows and only the application itself knows which one is conceptually the main window. In fact there may be no single main window. If there are two top level windows the application may have no preference for which one is the main window.

That said, what you can do is to enumerate all the top level windows with a call to EnumWindows . Then for each top level window call GetWindowThreadProcessId . This allows you to find out the process ID of the application that created each top-level window and from there you should be able to stitch together whatever information you decide that you need. So, that part of your question has no single definitive answer. You will need to work out exactly what you want before you progress.

Адрес и имя файла

Тип Variant

Бывают случаи, когда на этапе программирования мы еще не можем четко определить тип данных определенной переменной. В таком случае можно воспользоваться очень мощным типом Variant . Этот тип вводился в Delphi для поддержки технологии OLE ( Object Link and Embedding – внедрение и связь объектов). Такая технология широко используется в Windows для обмена данными между приложениями различного типа. С помощью OLE происходит вставка таблицы MS Excel в редактор текстов MS Word , или картинка из Paint легко вставляется в тот же редактор. В этой технологии Variant используется на каждом шагу, однако ему можно найти применение и в других случаях.

Переменные типа Variant могут принимать значения любого типа! Вы присваиваете такой переменной что угодно, а программа сама определяет ее тип на этапе выполнения. Давайте рассмотрим пример:

В этом примере во время выполнения программы тип переменной изменится 4 раза, и код выполнится корректно. Когда программа встречает тип Variant , она автоматически выделяет под нее память . Если значение не задано, переменной присваивается ноль.

Совет: старайтесь использовать тип Variant только там, где это действительно необходимо! За удобство использования такой переменной тоже приходится платить. Переменная такого типа занимает значительно больше памяти, чем переменная любого другого типа. Процессору мы тоже задаем лишнюю работу, ведь сначала нужно определить тип данных в переменной, затем присвоить этот тип самой переменной, и т.п. Кроме того, переменные типа Variant очень сложно отлаживать в больших программах. Складывая, к примеру, строку и целое число , вы можете получить совсем не тот результат, который ожидали!

Как вы считаете, какой результат окажется в конце концов в переменной v1 ? На первый взгляд, результат очевиден: число 16. Однако не спешите с выводами. Когда операторы вычисления имеют равный приоритет, они выполняются слева – направо. В данном примере вначале объединятся строки, в результате чего получится строка «15». Затем эта строка преобразуется в целое число , и к нему будет прибавлено число 10. Поэтому результат сложения – число 25.

Функции для работы с именем файла

Любая серьезная программа обязательно работает с каким-либо файлом, или даже с множеством файлов. Программы для работы с базами данных напрямую связаны с таблицами и индексами, которые представляют собой файлы различных форматов, редакторы текста работают с текстовыми файлами, а графические редакторы – с графическими. Все эти программы могут работать с настроечными файлами – файлами, в которых программа сохраняет пользовательские настройки, а при загрузке считывает их.

Там, где приходится работать с файлами, требуется уметь обрабатывать и имя файла : вычленять только имя или только адрес файла, диск , на котором файл находится, или расширение имени файла . Ниже представлен список функций, которые позволяют решить все эти задачи.

Функция ExtractFileName()

Функция возвращает имя файла без имени диска и каталогов, извлекая его из полного имени файла FileName . В качестве параметра указывается полный путь и имя файла .

Функция ExtractFilePath()

Функция возвращает путь к файлу, извлекая его из полного имени файла. Если имя файла не содержит ни имя каталогов, ни имя диска, то функция возвращает пустую строку. Подобное же действие выполняет функция ExtractFileDir() . Отличие этих функций в том, что в конце возвращаемого адреса функции ExtractFilePath() есть знак «\», а функция ExtractFileDir() этот знак не устанавливает:

Функция ExtractShortPathName()

Функция конвертирует длинное имя файла в DOS-формат, так называемый, 8.3. Этот формат подразумевает, что имя файла или папки может быть длиной максимум 8 символов, а затем, после точки, может присутствовать расширение имени файла из 3-х символов. Если имя папки (файла) имеет больше символов, оно будет обрезано до 8 символов.

Если указанный файл или каталог не существует, то функция возвращает пустую строку. Параметр может представлять собой полное имя файла. Если указанный файл не существует, то функция возвращает пустую строку. Пример:

Процедура ProcessPath()

Процедура анализирует полное имя файла и возвращает отдельно имя диска, каталог и имя файла . Если файл не существует, то возникает ошибка. Когда полное имя файла содержит больше одного каталога, также возникает ошибка.

Функция ExtractFileDrive()

Функция возвращает имя диска, извлеченное из полного имени файла. Если указанное имя файла не содержит имя диска, то функция возвращает пустую строку. Для имени в UNC формате (сетевое имя) возвращается строка в формате ‘\\ \ ‘.

Функция ExtractFileExt()

Функция возвращает расширение файла, имя которого указано в параметре. Результирующая строка включает в себя символ точки и символы расширения файла. Если указанное имя файла не имеет расширения, то функция возвращает пустую строку. Пример:

Пишем программу

Чтобы усвоить, как работают эти функции, создадим новое приложение . Форму сразу переименуйте в fMain , а проект сохраните под названием fname в отдельной папке. На форму установите Edit , здесь будет отображаться полное имя файла . Сразу под ней установите Label , тут будет отображаться результат работы функций. Очистите текст и у Edit и у Label . Ниже бросьте на форму кнопку, и напишите на ней «Открыть файл «. Рядом с ней бросьте OpenDialog , он нам понадобится для открытия нужного файла. Еще ниже сгруппируйте 6 кнопок, на которых напишите:

Использование процедур и функций в Delphi

Скобки

Добавление скобок при вызове процедур и функций без параметров уже давно не является новинкой в Delphi, тем не менее, эта возможность мало известна. Эту возможность оценят по достоинству те программисты, которым приходится работать на двух языках (C++ и Delphi), так как им не нужно будет постоянно помнить о разнице в синтаксисе при вызове процедур и функций в разных языках. В Delphi оба варианта, приведенные ниже, считаются корректными.

Возможность перегрузки

Впервые концепция перегрузки процедур и функций была реализована в Delphi 4. Она позволяет иметь несколько различных процедур и функций с одинаковыми именами, но с разными списками параметров. Такие процедуры и функции должны быть описаны с применением директивы overload.

procedure Test (I: integer); overload;
procedure Test (S: string); overload;
procedure Test (D: double); overload;

При вызове процедуры Test, Delphi сама решит, какую из трех процедур необходимо выполнить, в зависимости от передаваемого ей параметра. Но нужно отметить, что это не самая безопасная возможность языка. Применение перегружаемых процедур и функций может стать неиссякаемым источником трудноуловимых ошибок в программе. Поэтому пользуйтесь этой возможностью осторожно.

Передача параметров

Pascal позволяет передавать параметры в функции и процедуры либо по значению, либо по ссылке. Передаваемый параметр может иметь любой встроенный или пользовательский тип либо являться открытым массивом. Параметр также может быть константой, если его значение в процедуре или функции не меняется.

Передача параметров по значению

Этот режим передачи параметров применяется по умолчанию. Если параметр передается по значению, создается локальная копия данной переменной, которая и предоставляется для обработки в процедуру или функцию. Посмотрите на следующий пример:

procedure Test(s: string);

При вызове указанной процедуры будет создана копия передаваемой ей в качестве параметра строки s, с которой и будет работать процедура Test. При этом все внесенные в строку изменения никак не отразятся на исходной переменной s.

Однако это не относится к объектам. Например, если в функцию передается переменная (а точнее экземпляр объекта) TStringList, то в данном случае произойдет передача по ссылке (даже если это не указано явно). Этот способ передачи является у большинства самым излюбленным, но в тоже время является и самым не практичным, т.к. для выполнения метода выделяется дополнительная память для создания точной копией передаваемой переменой. Для решения этой проблемы следует использовать один из способов описанных ниже.

Передача параметров по ссылке

Pascal позволяет также передавать параметры в функции или процедуры по ссылке — такие параметры называются параметрами-переменными. Передача параметра по ссылке означает, что функция или процедура сможет изменить полученные значения параметров. Для передачи параметров по ссылке используется ключевое слово var, помещаемое в список параметров вызываемой процедуры или функции.

procedure ChangeMe(var x: longint);
begin
x := 2; // Параметр х изменен вызванной процедурой
end;

Вместо создания копии переменной x, ключевое слово var требует передачи адреса самой переменной x, что позволяет процедуре непосредственно изменять ее значение.

Передача параметров констант

Если нет необходимости изменять передаваемые функции или процедуре данные, можно описать параметр как константу. Ключевое слово const не только защищает параметр от изменения, но и позволяет компилятору сгенерировать более оптимальный код передачи строк и записей. Вот пример объявления параметра-константы:

procedure Test(const s: string );

Передача открытых массивов

Открытый массив параметров позволяет передавать в функцию или процедуру различное количество параметров. В качестве параметров можно передать либо открытый массив элементов одинакового типа, либо массивы констант различного типа. В приведенном ниже примере объявляется функция, которой в качестве параметра должен передаваться открытый массив целых чисел.

function AddEmUp(A: array of integer): integer;

В открытом массиве можно передавать переменные, константы или выражения из констант.

Для получения информации о фактически передаваемом массиве параметров в функции или процедуре могут использоваться функции High, Low и SizeOf.

Object Pascal также поддерживает тип array of const, который позволяет передавать в одном массиве данные различных типов. Синтаксис объявления функций или процедур, использующих такой массив для получения параметров, следующий:

procedure WhatHaveIGot( A: array of const );

Вызвать объявленную выше функцию можно, например, с помощью такого оператора:

procedure WhatHaveIGot( [‘Text’, 10, 5.5, @WhatHaveIGot, 3.14, true, ‘c’] );

При передаче функции или процедуре массива констант все передаваемые параметры компилятор неявно конвертирует в тип TVarRec. Тип данных TVarRec объявлен в модуле System следующим образом:

PVarRec = ^TVarRec;
TVarRec = record
case Byte of
vtInteger: (VInteger: Integer; VType: Byte);
vtBoolean: (VBoolean: Boolean);
vtChar: (VChar: Char);
vtExtended: (VExtended: PExtended);
vtString: (VString: PShortString);
vtPointer: (VPointer: Pointer);
vtPChar: (VPChar: PChar);
vtObject: (VObject: TObject);
vtClass: (VClass: TClass);
vtWideChar: (VWideChar: WideChar);
vtPWideChar: (VPWideChar: PWideChar);
vtAnsiString: (VAnsiString: Pointer);
vtCurrency: (VCurrency: PCurrency);
vtVariant: (VVariant: PVariant);
vtInterface: (VInterface: Pointer);
vtWideString: (VWideString: Pointer);
vtInt64: (VInt64: PInt64);
end;

Поле VType определяет тип содержащихся в данном экземпляре записи TVarRec данных и может принимать одно приведенных значений.

Поскольку массив констант способен передавать данные разных типов, это может вызвать определенные затруднения при создании обрабатывающей полученные параметры функции или процедуры. В качестве примера работы с таким массивом рассмотрим реализацию процедуры WhatHaveIGot, которая просматривает элементы полученного массива параметров и выводит их тип.

procedure WhatHaveIGot( A: array of const );
var
i: integer;
TypeStr: string;
begin
for i := Low(A) to High(A) do
begin
case A[i].VType of
vtInteger : TypeStr := ‘Integer’;
vtBoolean : TypeStr := ‘Boolean’;
vtChar : TypeStr := ‘Char’;
vtExtended : TypeStr := ‘Extended’;
vtString : TypeStr := ‘String’;
vtPointer : TypeStr := ‘Pointer’;
vtPChar : TypeStr := ‘PChar’;
vtObject : TypeStr := ‘Object’;
vt ;
vtW ;
vtPW ;
vtAnsiString : TypeStr := ‘AnsiString’;
vtCurrency : TypeStr := ‘Currency’;
vtVariant : TypeStr := ‘Variant’;
vtInterface : TypeStr := ‘Interface’;
vtW ;
vtInt64 : TypeStr := ‘Int64’;
end;
ShowMessage( Format( ‘Array item %d is a %s’, [i, TypeStr] ) );
end;
end;

Значения параметров по умолчанию

В Delphi есть одна очень полезная возможность — использование значений параметров по умолчанию. Она позволяет установить принимаемое по умолчанию значение параметра процедуры или функции. Это значение будет использоваться в тех случаях, когда вызов процедуры или функции производится без указания значения данного параметра. В объявлении процедуры или функции принимаемое по умолчанию значение параметра указывается после знака равенства, следующего после его имени. Поясним это на следующем примере:

procedure HasDefVal( s: string; i: integer = 0 );

Подобное объявление означает, что процедура HasDefVal может быть вызвана двумя путями. В первом случае — как обычно, с указанием обоих параметров:

procedure HasDefVal( ‘Hello’, 26 );

Во втором случае можно задать только значение параметра s, а для параметра i использовать значение, установленное по умолчанию:

procedure HasDefVal( ‘Hello’ );

При использовании значении параметров по умолчанию следует помнить о нескольких приведенных ниже правилах:

  • Параметры, имеющие значения по умолчанию, должны располагаться в конце списка параметров. Параметр без значения по умолчанию не должен встречаться в списке после параметра, имеющего значение по умолчанию.
  • Значения по умолчанию могут присваиваться только параметрам обычных типов, указателям или множествам.
  • Значение по умолчанию может передаваться только по значению либо с модификатором const. Оно не может быть ссылкой или нетипизированным параметром.

Одним из важных преимуществ применения значений параметров по умолчанию является простота расширения функциональных возможностей уже имеющихся процедур и функции с соблюдением обратной совместимости. Предположим, на рынок программных продуктов была выпущена программа, ключевым звеном которой является функция сложения двух целых величин:

function Add( I1, I2: integer ): integer;
begin
Result := I1 + I2;
end;

Предположим также, что исследования показали целесообразность добавления в программу возможности сложения трех чисел. Однако замена имеющейся функции функцией сложения трех чисел приведет к тому, что вам придется переправлять немало текста, который перестанет компилироваться из-за внесения в функцию еще одного параметра. Однако при использовании значений параметров по умолчанию проблема решается легко и просто. Достаточно изменить объявление функции так, как показано ниже.

function Add( I1, I2: integer; I3: integer = 0 ): integer;
begin
Result := I1 + I2 + I3;
end;

Директива

Директива <$X->запрещает вызов функций как процедур (с игнорированием возвращаемого результата). По умолчанию этот режим включен (<$X+>). Так вот, запомните, использование переменной Result недопустимо при сброшенном флажке опции Extended Syntax, расположенном во вкладке Compiler диалогового окна Project Options, или при указании директивы компилятора <$X->.

В каждой функции языка Objecl Pascal существует локальная переменная с именем Result, предназначенная для размещения возвращаемого значения. Кроме того, вернуть значение из функции можно также путем присвоения значения переменной, имеющей то же имя, что и данная функция. Это стандартный синтаксис языка Pascal, сохранившийся от его предыдущих версий. При использовании в теле функции переменной с ее именем не забывайте, что существуют большие отличия в обработке этого имени — все зависит от того, где она расположена — в левой части оператора присвоения или же в любом другом месте текста функции. Если имя функции указано в левой части оператора присвоения, то предполагается, что назначается возвращаемое функцией значение. Во всех других случаях предполагается, что осуществляется рекурсивный вызов этой функции.

Процедура и функция — это ключевые понятия в любом языке программирования, без которых не обходится ни одна серьезная программа. И поэтому очень важно иметь полное понимание о механизме их работы.

ProcessPath — Процедура Delphi

На Дельфи:
Function GetMemSharedNT(pid,memSize,hProcess: Cardinal): Pointer;
Begin
hProcess := OpenProcess(PROCESS_VM_OPERATION Or PROCESS_VM_READ Or PROCESS_VM_WRITE, False, pid);
Result := VirtualAllocEx(hProcess, nil, memSize, MEM_RESERVE Or MEM_COMMIT, PAGE_READWRITE);
End;

На VB:
Public Function GetMemSharedNT(ByVal pid As Long, ByVal memSize As Long, hProcess As Long) As Long
hProcess = OpenProcess(PROCESS_VM_OPERATION Or PROCESS_VM_READ Or PROCESS_VM_WRITE, False, pid)
GetMemSharedNT = VirtualAllocEx(ByVal hProcess, ByVal 0&, ByVal memSize, MEM_RESERVE Or MEM_COMMIT, PAGE_READWRITE)
End Function

pid в обоих случаях равен, но hProcess почему-то разный.
Есть у кого-нибудь мысли на этот счёт? Спасибо.


> hProcess почему-то разный

а почему он д.б. одинаковый ?

хэндл процесса — локально уникален, в то время как Id процесса глобально уникален.

А почему он должен быть одинаковым?

Я же запускаю два варианта на одной машине почти одновременно, но Дельфи-вариант выдаёт всё время хэндл = 92.
Мне это нужно для контроля правильности перевода VB-кода на Дельфи.

Дельфи-вариант выдаёт всё время хэндл = 92

Случайность. Не следует на это обращать внимание. Выделение дескрипторов — прерогатива ОС. В разных процессах они имеют совершенно разный смысл. Лично Вам что-то число 92 говорит? :)


> Дельфи-вариант выдаёт всё время хэндл = 92

ну и пусть себе выдает !
хоть 92 , хоть 65876546354635 ..

ибо 0 означает отказ ф-ции по тем или иным причинам, которые всегда можно уточнить, тут же вызвав GetLastError


> нужно для контроля правильности перевода VB-кода на Дельфи

странный «способ» — опираться на домыслы, а не на документацию

Не совсем понятно про какие домыслы идёт речь. Ведь переводом из VB в Паскаль занимаюсь я и здесь же сам себя и проверяю.
У меня есть пример на VB, который выдаёт список всего, что находится в трее, а я пытаюсь этот пример перевести на Паскаль.


> Не совсем понятно про какие домыслы идёт речь

домыслом дан.случае является ожидание тобой одинаковых значений хэндла одного и того же процесса


> Ведь переводом из VB в Паскаль занимаюсь я и здесь же сам
> себя и проверяю

переводить-то тоже с умом нужно !

в VB-коде присутствует некорректность, и ты ее тащишь один-в-один в свой код

некорректность заключается в отсутствии проверки значений, возвращаемых WinAPI-ф-циями, на предмет успешного или неуспешного выполнения

AbrosimovA (15.06.05 8:14) [6]

Все уже сказано в [1]

Digitman © (15.06.05 08:32) [7]
>в VB-коде присутствует некорректность

Тем не менее VB-код работает, а мой — нет.

Application.ProcessMessages и ход выполнения процедуры

Доброй ночи, подскажите пожалуйста! Куда нужно «влепить» ProcessMessages, чтобы «ожила» анимация?

Type Visibility Source Unit Parent
28.05.2020, 02:16

Skype4COM и Application.ProcessMessages
при использовании длл Skype4COM.dll нельзя использовать Application.ProcessMessages; как выйти с.

Application.ProcessMessages и потоки
Здравствуйте, можете подсказать по таким вопросам: 1. Application.ProcessMessages работает.

Необычное зависание формы. Application.ProcessMessages нервно курит
Всем доброго времени суток! Delphi RAD Studio XE4. Обычное приложение Delphi. Программа для.

Массив из миллиона элементов. Прогрессбар. Кнопка выхода из цикла. Application.ProcessMessages
Доброго времени суток. Нужна помощь. Дан одномерный целочисленный массив из миллиона.

Нужно отобразить ход выполнения.
Знающие люди, помогите! У меня есть программа в которой долго идет вычисление (минут 7). Мне нужно.

Получить список всех подножки процессов (с ProcessName + ProcessPath + ProcessTitle)

то , что i’am пытается сделать:

получить список всех процессов подножки с: processName (без .exe ) ProcessFullFilePath ProcessMainWindowTitle что — то вроде:

Очень важно: я должен работать код , который не будет делать никаких исключений ( try catch )

Моим код:
я использовал , TLHelp32 чтобы получить список имен:

это не достаточно, мне нужно: название имя пути

Эта функция не хорошо:

Проблема заключается в том, что data.szExeFile[i] <> » всегда оценивает True . Это потому , что data.szExeFile[i] это один символ типа char , и » это пустая строка , которая никогда не равна одному символу.

На самом деле можно реализовать GetName так:

Вам также необходимо инициализировать data перед вызовом , Process32First как описано в документации. Вам нужно написать:

прежде чем звонить Process32First .

Вот отлажена версия вашей программы:

Обратите внимание , что это не даст вам полный путь к исполняемому файлу. Чтобы получить полный путь , который вы должны использовать GetModuleFileNameEx . Это , в свою очередь , требует дескриптор процесса , который вы получаете от идентификатора процесса по телефону OpenProcess . И идентификатор процесса находится в TProcessEntry32 записи.

Что же касается главного заголовка окна, это более сложно. Многие процессы не будут иметь главное окно. Более того, даже те, которые, как вы знаете, какое окно главное окно? Процесс может иметь несколько окон верхнего уровня и только само приложение, которое знает один концептуально главное окно. На самом деле не может быть ни одного главного окна. Если есть два верхние окна на уровень приложение может не иметь никакого предпочтения, для которых один является главным окном.

Это говорит, что вы можете сделать , это перечислить все окна верхнего уровня с вызовом EnumWindows . Тогда для каждого окна уровня вызова верхнего GetWindowThreadProcessId . Это позволяет узнать идентификатор процесса приложения, создавшей каждое окно верхнего уровня , а оттуда вы должны быть в состоянии склеивать любую информацию , вы решили , что вам нужно. Таким образом, та часть вашего вопроса не имеет ни одного окончательного ответа. Вам нужно будет работать именно то , что вы хотите , прежде чем прогрессировать.

Илон Маск рекомендует:  Плавающая ширина картинки
Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL