![]() |
|
|
|
|
#1
|
|||
|
|||
|
Здравствуйте, интересует вопрос такого характера : Возможно ли программным путем определить параметр запуска приложения?
Объясняю 1. Запускаю D:\1.exe 2. Запускаю с параметром D:\1.exe -connect 3. Интересует как выдернуть сам параметр с которым было запущено приложение ? т.е. в данном случаи "-connect" |
|
#2
|
|||
|
|||
|
ParamCount - кол-во параметров.
ParamStr(0) - имя запускаемого файла (тоже самое, что Application.ExeName) ParamStr(#) - параметры, 1 <= # <= ParamCount |
|
#3
|
|||
|
|||
|
Изъяснился не полностью =/ Извеняюсь...
Для чужого приложения ... |
|
#4
|
|||
|
|||
|
Э-э-э... не уверен, что это можно получить простым способом.
Точнее можно, но придется лезть в память чужого процесса, на что начинают нервно реагировать UAC, антивирусы, да и сама система этого не любит, может и BSOD показать, если чуть нетуда залезешь. |
|
#5
|
|||
|
|||
|
Решение найдено в интернете ) мало ли кому пригодится
Код:
{$APPTYPE CONSOLE}
program getcommline; uses windows;
// ported C program to Delphi. Returns exact command-line used in calling program, including command-line parms.
type
TUnicodeString = record
Length: ShortInt;
MaxLength: ShortInt;
Buffer: PWideChar;
end;
TProcessBasicInformation = record
ExitStatus: DWord;
PEBBaseAddress: Pointer;
AffinityMask: DWord;
BasePriority: DWord;
UniqueProcessID: Word;
ParentProcessID: DWord;
end;
function GetPEBAddress(inhandle: THandle): pointer;
type
NTQIP = procedure(ProcessHandle: THandle;
ProcessInformationClass: DWord;
ProcessInformation: Pointer;
ProcessInformationLength: DWord;
ReturnLength: Pointer); stdcall;
var
pbi: TProcessBasicInformation;
MyHandle: THandle;
myFunc: NTQIP;
begin
MyHandle := LoadLibrary('NTDLL.DLL');
if MyHandle <> 0 then
begin
myfunc := GetProcAddress(myHandle, 'NtQueryInformationProcess');
if @myfunc <> nil then
MyFunc(inhandle, 0, @pbi, sizeof(pbi), nil);
end;
FreeLibrary(Myhandle);
Result := pbi.PEBBaseAddress;
end;
function getcommandline(inproc: THandle): string;
var
myproc: THandle;
rtlUserProcAddress: Pointer;
PMBAddress: Pointer;
command_line: TUnicodeString;
command_line_contents: WideString;
outr: DWord;
begin
myproc := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ,
false, inproc);
PMBAddress := GetPEBAddress(myproc);
ReadProcessMemory(myproc, Pointer(Longint(PMBAddress) + $10),
@rtlUserProcAddress, sizeof(Pointer), outr);
ReadProcessMemory(myproc, Pointer(Longint(rtlUserProcAddress) + $40),
@command_line, sizeof(command_line), outr);
SetLength(Command_Line_Contents, command_line.length);
ReadProcessMemory(myproc, command_Line.Buffer, @command_Line_contents[1],
command_line.length, outr);
CloseHandle(myproc);
Result := WideCharLenToString(PWideChar(command_Line_Contents),
command_line.length div 2);
end;
begin
writeln('This process invoked with: ');
writeln(GetCommandLine(GetCurrentProcessID));
readln;
end. |