![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
application.handle из dll
Gu © (2011-06-13 08:04:00)Как из dll узнать handle приложения, которое ее вызвало?
~ (2011-06-14 14:04:00) [1]
> У приложения нет хэндла - оно почему-то имеет только hInstance,
> PID и псевдохэндл равный значению DWORD(-1)
а ну да. Мне прежде чем отвечать нужно было прочитать ветку. В [7] же все сказано
Rouse_ (2011-06-14 12:41:00) [2]У приложения нет хэндла - оно почему-то имеет только hInstance, PID и псевдохэндл равный значению DWORD(-1)
~ (2011-06-13 20:53:00) [3]а почему приложение не может передовать хендл в либу в качестве параметра?
Игорь Шевченко (2011-06-13 20:26:00) [4]
> hwnd(GetProcessHandle(h))
ты такую траву завязывай курить
sniknik (2011-06-13 15:25:00) [5]> Pid и хандле процесса получаю норм
ответь -
Loginov Dmitry © (13.06.11 11:55) [7]
> Что такое "handle приложения" в твоем понимании?
иначе бессмысленно. ищешь там где светлее, а не где потерял.
Gu (2011-06-13 15:03:00) [6]Pid и хандле процесса получаю норм, если разремить TerminateProcess(result, 0); то прога закрывается (или вместо paramstr(0) notepad.exe писать и запускать блокнот, то он закрывается).
Gu (2011-06-13 15:00:00) [7]а так (если все это в dll выполняется)?
function FindProcess(Name : string): Dword;
var
FSnapshotHandle : THandle;
FProcessEntry32 : TProcessEntry32;
ContinueLoop:BOOL;
hp : Thandle;
begin
// result:=0;
FSnapshotHandle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
FProcessEntry32.dwSize := Sizeof(FProcessEntry32);
ContinueLoop := Process32First(FSnapshotHandle,FProcessEntry32);
while ContinueLoop do
begin
if Name = FProcessEntry32.szExeFile then
begin
result := FProcessEntry32.th32ProcessID;
CloseHandle(FSnapshotHandle);
exit;
end;
ContinueLoop := Process32Next(FSnapshotHandle,FProcessEntry32);
end;
CloseHandle(FSnapshotHandle);
end;
type
TProcessEntry32 = record
dwSize : DWORD;
cntUsage : DWORD;
th32ProcessID : DWORD;
th32DefaultHeapID : DWORD;
th32ModuleID : DWORD;
cntThreads : DWORD;
th32ParentProcessID : DWORD;
pcPriClassBase : integer;
dwFlags : DWORD;
szExeFile : array [0..MAX_PATH-1] of char;
end;
const
TH32CS_SnapProcess = 2;
var
pCreateToolhelp32Snapshot : function (dwFlags,th32ProcessID: cardinal) : cardinal; stdcall = nil;
pProcess32First : function (hSnapshot: cardinal; var lppe: TProcessEntry32) : bool; stdcall = nil;
pProcess32Next : function (hSnapshot: cardinal; var lppe: TProcessEntry32) : bool; stdcall = nil;
//==============================================================================
function TestToolhelpFunctions : boolean;
var
c1: cardinal;
begin
c1 := GetModuleHandle('kernel32');
@pCreateToolhelp32Snapshot := GetProcAddress(c1, 'CreateToolhelp32Snapshot');
@pProcess32First := GetProcAddress(c1,'Process32First');
@pProcess32Next := GetProcAddress(c1,'Process32Next');
result := (@pCreateToolhelp32Snapshot<>nil) and (@pProcess32First<>nil) and (@pProcess32Next<>nil);
end;
//==============================================================================
function CreateToolhelp32Snapshot (dwFlags,th32ProcessID: cardinal) : cardinal;
begin
result := 0;
if @pCreateToolhelp32Snapshot = nil then
if not TestToolhelpFunctions then
exit;
//end if
//end if
result := pCreateToolhelp32Snapshot(dwFlags, th32ProcessID);
end;
//==============================================================================
function Process32First(hSnapshot: cardinal; var lppe: TProcessEntry32) : bool;
begin
result := false;
if @pProcess32First = nil then
if not TestToolhelpFunctions then
exit;
//end if
//end if
result := pProcess32First(hSnapshot,lppe);
end;
//==============================================================================
function Process32Next(hSnapshot: cardinal; var lppe: TProcessEntry32) : bool;
begin
result := false;
if @pProcess32Next = nil then
if not TestToolhelpFunctions then
exit;
//end if
//end if
result := pProcess32Next(hSnapshot,lppe);
end;
//==============================================================================
function InjectDllToTarget(dllName : string; TargetProcessID : DWORD ): boolean;
var
LibName: pointer;
hProcess, ThreadHandle: Thandle;
BytesWritten, TheadID: DWORD;
begin
result := false;
hProcess := OpenProcess(PROCESS_ALL_ACCESS, FALSE, TargetProcessID);
if (hProcess = 0) then exit;
//end if
LibName := VirtualAllocEx(hProcess, 0, length(dllName) + 5, MEM_COMMIT, PAGE_READWRITE);
if (LibName <> nil) then
begin
WriteProcessMemory(hProcess, LibName, pchar(dllName), length(dllName), BytesWritten);
end;
//end if
ThreadHandle := CreateRemoteThread(hProcess, nil, 0, GetProcAddress(LoadLibrary('kernel32.dll'), 'LoadLibraryA'), LibName , 0, TheadID);
result := ThreadHandle <> 0;
WaitForSingleObject(ThreadHandle, INFINITE);
VirtualFreeEx(hProcess, LibName, 0, MEM_RELEASE);
CloseHandle(hProcess);
end;
function EnableDebugPrivilege(const Value: Boolean): Boolean;
const SE_DEBUG_NAME = 'SeDebugPrivilege';
var
hToken: THandle;
tp: TOKEN_PRIVILEGES;
d: DWORD;
begin
Result := False;
if OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, hToken) then
begin
tp.PrivilegeCount := 1;
LookupPrivilegeValue(nil, SE_DEBUG_NAME, tp.Privileges[0].Luid);
if Value then
tp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED//$00000002
else
tp.Privileges[0].Attributes := $80000000;
AdjustTokenPrivileges(hToken, False, tp, SizeOf(TOKEN_PRIVILEGES), nil, d);
if GetLastError = ERROR_SUCCESS then
begin
Result := True;
end;
CloseHandle(hToken);
end;
end;
function GetProcessHandle(ProcessID: DWORD): thandle;
begin
EnableDebugPrivilege(true);
Result := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_ALL_ACCESS, FALSE, ProcessID);
if getlasterror()<>0 then showmessage(SysErrorMessage(getlasterror)) else showmessage(inttostr(result));
// TerminateProcess(result, 0);
end;
procedure GetMyHandle;
var x:string;h:thandle;
begin
x:=extractfilename(extractfilename(paramstr(0)));h:=findProcess(x);
form1.Caption:='GetHandle: '+inttostr(hwnd(GetProcessHandle(h)))+' ID: '+inttostr(h);
end;
Юрий Зотов (2011-06-13 12:55:00) [8]> Gu (13.06.11 08:04)
> Как из dll узнать handle приложения, которое ее вызвало?
Из приложения вызвать функцию dll и передать в нее параметром. А функция запомнит полученный параметр в переменной DLL.
Loginov Dmitry (2011-06-13 11:55:00) [9]
> т.е. ответа не знаете
Тебе еще не надоело?
> Как из dll узнать handle приложения, которое ее вызвало?
Что такое "handle приложения" в твоем понимании?
Если речь идет о handle невидимого окна, создаваемого вместе с объектом Application, то его проще передать из EXE.
Но этого делать не следует!
sniknik (2011-06-13 11:47:00) [10]нормальная dll (возьми виндовую user32 например) может быть "вызвана" практически одновременно всеми работающими приложениями...
как, и зачем, определять каким?
это в твоей идиотской связке dll часть программы, и делается под 1 dll = 1 программа...
ну вот ты ее, эту связку, придумал, ты и придумывай как.
Anatoly Podgoretsky (2011-06-13 11:46:00) [11]
> т.е. ответа не знаете
А почему бы естественно не предположить, что просто не хотим отвечать?
Gu (2011-06-13 11:35:00) [12]т.е. ответа не знаете
Loginov Dmitry (2011-06-13 11:09:00) [13]
> можно просто ответить, без 'зачем' ?
Нельзя.
Gu (2011-06-13 11:06:00) [14]можно просто ответить, без 'зачем' ? :)
Loginov Dmitry (2011-06-13 10:06:00) [15]Зачем? Очередная попытка хранения форм в DLL?