Форум: "Начинающим";
Текущий архив: 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