Необходимо предпочесть внешнюю версию по внутренней версии. Это - просто определенная версия правила, переместите что-либо вне цикла, который можно переместить вне цикла. В зависимости от компилятора IL и JIT-компилятора Ваши две версии могут или не могут закончиться с различными рабочими характеристиками.
На другой ноте необходимо, вероятно, посмотреть на плавание. TryParse или Преобразовывают. ToFloat.
Вы можете использовать функцию CreateToolhelp32Snapshot для перечисления списка запущенных процессов, а затем функцию Process32First , чтобы получить th32ParentProcessID , который является идентификатором процесса, который создал этот процесс (его родительский процесс).
См. этот пример.
uses
Psapi,
Windows,
tlhelp32,
SysUtils;
function GetTheParentProcessFileName(): String;
const
BufferSize = 4096;
var
HandleSnapShot : THandle;
EntryParentProc : TProcessEntry32;
CurrentProcessId: DWORD;
HandleParentProc: THandle;
ParentProcessId : DWORD;
ParentProcessFound : Boolean;
ParentProcPath : String;
begin
ParentProcessFound := False;
HandleSnapShot := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); //enumerate the process
if HandleSnapShot <> INVALID_HANDLE_VALUE then
begin
EntryParentProc.dwSize := SizeOf(EntryParentProc);
if Process32First(HandleSnapShot, EntryParentProc) then //find the first process
begin
CurrentProcessId := GetCurrentProcessId(); //get the id of the current process
repeat
if EntryParentProc.th32ProcessID = CurrentProcessId then
begin
ParentProcessId := EntryParentProc.th32ParentProcessID; //get the id of the parent process
HandleParentProc := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, False, ParentProcessId);
if HandleParentProc <> 0 then
begin
ParentProcessFound := True;
SetLength(ParentProcPath, BufferSize);
GetModuleFileNameEx(HandleParentProc, 0, PChar(ParentProcPath),BufferSize);
ParentProcPath := PChar(ParentProcPath);
CloseHandle(HandleParentProc);
end;
break;
end;
until not Process32Next(HandleSnapShot, EntryParentProc);
end;
CloseHandle(HandleSnapShot);
end;
if ParentProcessFound then
Result := ParentProcPath
else
Result := '';
end;
Я бы добавил дополнительный параметр, о котором вы знаете только (это может быть guid), если этот guid не является частью параметров, переданных вашей утилите .. Немедленно завершите приложение.
Быстрый ответ на ваш вопрос: «Нет, вы не можете предотвратить выполнение приложения». Если это исполняемый файл, то его можно запустить. Это невозможно остановить.
И, если вы не можете управлять приложением (как, кажется, указывают ваши комментарии), тогда отличное предложение Джи не сработает, верно? У вас нет возможности контролировать то, что делает приложение, и вы не можете контролировать его реакцию на вашу специальную командную строку.
Это действительно интересная ситуация.
Единственный способ обойти это - полностью запретить доступ к EXE или, по крайней мере, затруднить его поиск.
Вы можете сделать следующее:
Мы используем довольно простой метод, который требует всего несколько строк кода. Родительское приложение и служебное приложение используют некоторые общие строки GUIID (в коде) и вызывают RegisterWindowMessage, чтобы создать своего рода протокол рукопожатия «Hello». Это сообщение публикуется при первом запуске служебного приложения. Если родительское приложение запущено и запустило утилиту, оно отправляет ответное сообщение, которое утилита видит, и все в порядке. В противном случае утилита завершает работу и завершает работу.
Если это приложение запускается только изнутри хоста, почему бы просто не включить формы для этого приложения в главное приложение и не активировать его, как другую форму?