Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: WinAPI и системное программирование > Как получить хендл приложения из Dll


Автор: Teran 18.11.2006, 23:19
есть длл подключённая к приложению почему
в приложении
Код

Application.Handle

и 
Код

Library Test;

uses
  SysUtils,
  Windows;

exports
  Test1;

BEGIN
MessageBox(0,Pchar(IntToStr(GetModuleHandle(nil))),'',mb_ok);
END.

получаются разные?
и какая функция в dll покажет такойже Handle как и в приложении

Автор: bems 19.11.2006, 00:08
application.handle это не хэндл модуля, а дескриптор окна, которое влядеет(в смысле системы, а не VCL) формами приложения.

попробуй делать твою строку MessageBox(0,Pchar(IntToStr(GetModuleHandle(nil))),'',mb_ok)
и из библиотеки и из приложения - результат будет одинаковый и совпадет с переменной hInstance (приложения а не длл)

Автор: Teran 19.11.2006, 01:51
а как узнать именно "дескриптор окна" приложения из dll?  smile 

Автор: dumb 19.11.2006, 02:45
сделать в dll функцию Init и передавать в нее необходимые параметры.

Автор: bems 19.11.2006, 02:59
Код

function GetApplicationHandle:HWND;
var MyPID,WinPID:DWORD;
begin
MyPID:=GetCurrentProcessID;
result:=0;
repeat
 wnd:=FindWindowEx(0,result,'TApplication',nil);
 GetWindowThreadProcessId(result,WinPID);
until (result=0) or (WinPID=MyPID);
end;

Это работает если в твоем процессе нет другого окна с таким именем класса. 
Обычно так и есть

Автор: ArtemRubtsov 24.11.2006, 04:14
из приложения
Код

UpdateDll(@Form1.Handle); //external


в длл
Код


interface

procedure UpdateDll(Param : pHandle); stdcall;

var
LocalHandle : THandle;

implementation

procedure UpdateDll(Param : pHandle);stdcall;
begin
LocalHandle := Param^;
...
...
end;


Exports
UpdateDll;



Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)