PDA

View Full Version : تشخیص چگونگی اجرای یک برنامه ...



fire-wizard
جمعه 03 اسفند 1386, 08:16 صبح
با سلام ...

دوستان ایا راهی وجود داره که بشه تشخیص بدم که ایا برنامه ی من با کلیک کردن بر روی ایکنش توی ویندوز اجرا شده یا اینکه توسط یک برنامه ی دیگه اجرا شده !!!!؟؟؟؟

اگه راه مطمئنی وجود داره لطفا راهنمایی کنید ...

با تشکر ...

dkhatibi
جمعه 03 اسفند 1386, 18:38 عصر
یک برنامه ی دیگه چه جوری برنامه ی شما را اجرا می کنه؟؟!!!

Mr.reCoder
شنبه 04 اسفند 1386, 06:19 صبح
خوب با تابع CreateToolhelp32Snapshot و Process32Next میتونی اینکار رو بکنی!
برای اطلاعات بیشتر به خودم رجوع کن!:متعجب:
میدونی که کجام!!!:لبخند:

Mr.reCoder
شنبه 04 اسفند 1386, 06:21 صبح
یک برنامه ی دیگه چه جوری برنامه ی شما را اجرا می کنه؟؟!!!
به نطر من تابع CreateProcess تنها تابع مناسب برای اینکار است!:چشمک:
البته این نظر شخصی خودم است و هیچ قصد و غرضی ندارم!:متعجب:

fire-wizard
شنبه 04 اسفند 1386, 14:45 عصر
بابت جوابت ممنونم .... خودم پیداش کردم ( البته همین رو نه ولی یک چیز بهتر رو پیدا کردم که بیشتر به کارم میومد )

ممنونم ...

arshia_
دوشنبه 06 اسفند 1386, 08:16 صبح
بهتر نیست نتایج بدست اومده رو با دیگران به اشتراک بذارین؟

vcldeveloper
دوشنبه 06 اسفند 1386, 16:09 عصر
بهتر نیست نتایج بدست اومده رو با دیگران به اشتراک بذارین؟
متاسفانه دوستان بحث در تاپیک رو با بحث در پیام خصوصی اشتباه گرفتند!

جواب:


uses TlHelp32;

function GetParentProcessID(const ExeFileName: string): Cardinal;
var
SnapshotHandle : THandle;
pe32 : TProcessEntry32;
begin
Result := 0;
SnapshotHandle := CreateToolhelp32SnapShot(TH32CS_SNAPPROCESS,0);
if SnapshotHandle <= 0 then
RaiseLastOSError;
try
pe32.dwSize := SizeOf(pe32);
if Process32First(SnapshotHandle,pe32) then
begin
repeat
if LowerCase(ExtractFileName(ExeFileName)) = LowerCase(Trim(pe32.szExeFile)) then
begin
Result := pe32.th32ParentProcessID;
break;
end;
{after each invokation of Process32First or Process32Next, dwSize
value is changed to the current data size; therefore, dwSize must be
set each time any of the above routins are called. }
pe32.dwSize := SizeOf(pe32);
until Process32Next(SnapshotHandle,pe32) = False;
end;
finally
CloseHandle(SnapshotHandle);
end;
end;

function GetProcessName(ProcessID: Cardinal): string;
var
SnapshotHandle : THandle;
pe32 : TProcessEntry32;
begin
SnapshotHandle := CreateToolhelp32SnapShot(TH32CS_SNAPPROCESS,0);
if SnapshotHandle <= 0 then
RaiseLastOSError;
try
pe32.dwSize := SizeOf(pe32);
if Process32First(SnapshotHandle,pe32) then
begin
repeat
if ProcessID = pe32.th32ProcessID then
begin
Result := pe32.szExeFile;
break;
end;
pe32.dwSize := SizeOf(pe32);
until Process32Next(SnapshotHandle,pe32) = False;
end;
finally
CloseHandle(SnapshotHandle);
end;
end;

مثال:


var
ProcessID : Cardinal;
begin
ProcessID := GetParentProcessID(Application.ExeName);
ShowMessage(Format('ID: %d, Name: %s',[ProcessID,GetProcessName(ProcessID)]));
end;

البته بهتره بجای دو بار نوشتن بخش اعظم این کدها، یک کلاس بنویسید که بصورت داخلی لیستی از Process های فعال رو نگه داری کنه و متدهایی داشته باشه که داده های مختلف مربوط به یک Process یا کل Process های فعال را برگردونه.