Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2011.10.02;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.004 c
15-1307485149
Marser
2011-06-08 02:19
2011.10.02
А я вот во Львов переехал...


15-1307527244
Sergey
2011-06-08 14:00
2011.10.02
Удаленный доступ к интернет


15-1307391683
GanibalLector
2011-06-07 00:21
2011.10.02
tcp over serial


8-1216117521
evil_mike
2008-07-15 14:25
2011.10.02
BitBlt - где косяк?


2-1305747906
volkafff
2011-05-18 23:45
2011.10.02
Serversocket и Clientsocket





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский