Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2011.10.02;
Скачать: CL | DM;

Вниз

application.handle из dll   Найти похожие ветки 

 
Gu   (2011-06-13 08:04) [0]

Как из dll узнать handle приложения, которое ее вызвало?


 
Loginov Dmitry ©   (2011-06-13 10:06) [1]

Зачем? Очередная попытка хранения форм в DLL?


 
Gu   (2011-06-13 11:06) [2]

можно просто ответить, без "зачем" ? :)


 
Loginov Dmitry ©   (2011-06-13 11:09) [3]


> можно просто ответить, без "зачем" ?


Нельзя.


 
Gu   (2011-06-13 11:35) [4]

т.е. ответа не знаете


 
Anatoly Podgoretsky ©   (2011-06-13 11:46) [5]


> т.е. ответа не знаете

А почему бы естественно не предположить, что просто не хотим отвечать?


 
sniknik ©   (2011-06-13 11:47) [6]

нормальная dll (возьми виндовую user32 например) может быть "вызвана" практически одновременно всеми работающими приложениями...
как, и зачем, определять каким?

это в твоей идиотской связке dll часть программы, и делается под 1 dll = 1 программа...
ну вот ты ее, эту связку, придумал, ты и придумывай как.


 
Loginov Dmitry ©   (2011-06-13 11:55) [7]


> т.е. ответа не знаете


Тебе еще не надоело?


> Как из dll узнать handle приложения, которое ее вызвало?


Что такое "handle приложения" в твоем понимании?

Если речь идет о handle невидимого окна, создаваемого вместе с объектом Application, то его проще передать из EXE.
Но этого делать не следует!


 
Юрий Зотов ©   (2011-06-13 12:55) [8]

> Gu   (13.06.11 08:04)  

> Как из dll узнать handle приложения, которое ее вызвало?

Из приложения вызвать функцию dll и передать в нее параметром. А функция запомнит полученный параметр в переменной DLL.


 
Gu   (2011-06-13 15:00) [9]

а так (если все это в 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;



 
Gu   (2011-06-13 15:03) [10]

Pid и хандле процесса получаю норм, если разремить TerminateProcess(result, 0); то прога закрывается (или вместо paramstr(0) notepad.exe писать и запускать блокнот, то он закрывается).


 
sniknik ©   (2011-06-13 15:25) [11]

> Pid и хандле процесса получаю норм
ответь -
Loginov Dmitry ©   (13.06.11 11:55) [7]
> Что такое "handle приложения" в твоем понимании?

иначе бессмысленно. ищешь там где светлее, а не где потерял.


 
Игорь Шевченко ©   (2011-06-13 20:26) [12]


> hwnd(GetProcessHandle(h))


ты такую траву завязывай курить


 
~   (2011-06-13 20:53) [13]

а почему приложение не может передовать хендл в либу в качестве параметра?


 
Rouse_ ©   (2011-06-14 12:41) [14]

У приложения нет хэндла - оно почему-то имеет только hInstance, PID и псевдохэндл равный значению DWORD(-1)


 
~   (2011-06-14 14:04) [15]


> У приложения нет хэндла - оно почему-то имеет только hInstance,
>  PID и псевдохэндл равный значению DWORD(-1)


а ну да. Мне прежде чем отвечать нужно было прочитать ветку. В [7] же все сказано



Страницы: 1 вся ветка

Текущий архив: 2011.10.02;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.008 c
2-1308038218
mdsuz07
2011-06-14 11:56
2011.10.02
Ошибка доступа: Access violation at address


2-1307616232
AlekVolsk
2011-06-09 14:43
2011.10.02
Изменение местоположения папки Мои документы


2-1307937881
Gu
2011-06-13 08:04
2011.10.02
application.handle из dll


15-1307587555
Дмитрий С
2011-06-09 06:45
2011.10.02
Как запретить всяким quicktime, vlc, acrobat-ам регистрироваться


15-1307392194
Юрий
2011-06-07 00:29
2011.10.02
С днем рождения ! 7 июня 2011 вторник