![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
не возвр. handle, почему? [D7, XP]
xaxatun © (2008-05-26 06:16:00)function CreateWindow (WindowProc:Pointer; L,T,W,H:Word) :HWND; export; stdcall;
var
wnd :TWndClassEx;
begin
ZeroMemory (@wnd, SIZEOF (wnd));
with wnd do begin
cbSize := SIZEOF (wnd);
lpfnWndProc := WindowProc;
hInstance := hInstance;
hCursor := LoadCursor (0, IDC_ARROW);
lpszClassName := 'x';
end;
RegisterClassEx (wnd);
Result := Windows.CreateWindowEx (WS_EX_APPWINDOW, 'x', 'x', WS_POPUP, L, T, W, H, 0, 0, hInstance, nil);
end;
функцию созд. окна поместил в dll'ку, перестала возвращать handle, почему? если скопировать в модуль программы - работает, в dll'ке нет, в чем может быть причина?
Loginov Dmitry (2008-05-26 23:23:00) [1]цитата не совсем правильная, ну надеюсь, что хоть в тему сказанул :)
Loginov Dmitry (2008-05-26 23:22:00) [2]> Уже не однократно сталкивался, что в .dll созданных в Delphi
> hInstance = 0, поэтому функция регистрации класса завершается
> успешно, а создание окна возвращает "неверный параметр".
> Возможно это такая особенность компилятора, возможно я чего-
> то недопонимаю, почемк так. Но если передать из приложения
> ссылку на hInstance .exe - то все прекрасно работает.
Компилятор непричем. Класс окна - структура, состоящая из имени, различных параметров, адреса оконной функции и hInstance. При создании окна указывается имя класса и hInstance (без адреса оконной функции). При вызове функции CreateWindows() Windows выполняет поиск производного класса окна, только среди классов, зарегистрированных в данном приложении. В приложении может быть (и будет) сколько угодно одноименных оконных классов (но hInstance у всех разные). Для поиска используются параметры "имя класса" и hInstance. hInstance - может быть любое (произвольное) число. Оно используется для того, чтобы найти класс с требуемой оконной функцией (если класс зарегистрирован в какой-то конкретной DLL (закреплен за DLL), то функция CreateWindows() (обычно) должна обращаться именно к этому классу). Может и мутно написано, но основной смысл в этом, остальное - в хэлпе.
Leonid Troyanovsky (2008-05-26 22:33:00) [3]
> Leonid Troyanovsky © (26.05.08 22:15) [17]
See also:
http://msdn.microsoft.com/en-us/library/ms633574(VS.85).aspx
CS_GLOBALCLASS
--
Regards, LVT.
Leonid Troyanovsky (2008-05-26 22:15:00) [4]
> МистерТ (26.05.08 19:56) [14]
> hInstance = 0, поэтому функция регистрации класса завершается
> успешно, а создание окна возвращает "неверный параметр".
Все это неубедительно без указания места и вида WindowProc.
--
Regards, LVT.
ага0 (2008-05-26 21:28:00) [5]А. Да. Про ноль забыл сказать, ага. Экзешник по нижним адресам грузится, мот потому наверна ноль и прокатывает и при вызове из экзешника. А мож она ноль как дефолт принимает и сама экзешник подставляет, типа того. Да не пофиг ли почему, главно принимает:)
ага0 (2008-05-26 21:20:00) [6]2 МистерТ
Да че б ей быть нулем? Нормальная там hInstance, тока в ей адрес загрузки самой библиотеки. А для RegisterClassEx треба шоб в TWndClassEx.hInstance был адрес того модуля, куда кажить TWndClassEx.lpfnWndProc. Он жеж функцию из экзешника передает, экзешника hInstance и нужон. А тут ваще самому себе себя присваиват
> with wnd do begin
> cbSize := SIZEOF (wnd);
> lpfnWndProc := WindowProc;
> hInstance := hInstance;
ет означает
wnd.hInstance:=wnd.hInstance
натурально как был ноль так и остался:) Вот такие пироги.
МистерТ (2008-05-26 19:56:00) [7]> Leonid Troyanovsky © (26.05.08 09:22) [2]
> > МистерТ (26.05.08 09:04) [1]
> > hInstance из .exe передавай в .dll
>
> Начинать надо с Win32Check.
> Или, хотя бы, с передачи класса в CWE.
Уже не однократно сталкивался, что в .dll созданных в Delphi hInstance = 0, поэтому функция регистрации класса завершается успешно, а создание окна возвращает "неверный параметр".
Возможно это такая особенность компилятора, возможно я чего-то недопонимаю, почемк так. Но если передать из приложения ссылку на hInstance .exe - то все прекрасно работает.
Leonid Troyanovsky (2008-05-26 19:38:00) [8]
> xaxatun (26.05.08 19:15) [12]
> спасибо, не работало из за instance.
Любопытно.
--
Regards, LVT.
xaxatun (2008-05-26 19:15:00) [9]спасибо, не работало из за instance.
Leonid Troyanovsky (2008-05-26 19:08:00) [10]
> dev (26.05.08 18:57) [10]
Ты-то кто? Мало ли что у кого не работает.
Код показывай.
--
Regards, LVT.
dev (2008-05-26 18:57:00) [11]спасибо, не работало из за instance.
Leonid Troyanovsky (2008-05-26 18:31:00) [12]
> ага0 (26.05.08 16:52) [8]
> и не проходить
Чего гадать, пусть зовет Win32Check.
Класс и окно, очевидно, что в одном модуле.
--
Regards, LVT.
ага0 (2008-05-26 16:52:00) [13]А!!! Я понял, понял!!!
:)))
Ты про то, шо результ регистрации класса не проверяется! Ну дата, ага. Однако-ж думается, что он из-за инстанции и не проходить
ага0 (2008-05-26 16:48:00) [14]Я иль окончательно ослеп иль столь же окончательно поглупел ( что в прынцыпу равновероятно) - не вижу:(
> lpszClassName := 'x';
> Result := Windows.CreateWindowEx (WS_EX_APPWINDOW, 'x',
Не оно? Аль чет ишшо не так?
Leonid Troyanovsky (2008-05-26 16:26:00) [15]
> ага0 (26.05.08 16:14) [5]
> А какого пытютьси?
Хз, зри код.
--
Regards, LVT.
ага0 (2008-05-26 16:14:00) [16]
> Нать это, во-ще, к делу не относится, бо этого
> класса окна создавать и не пытаются.
А какого пытютьси?
Leonid Troyanovsky (2008-05-26 16:09:00) [17]
> ага0 (26.05.08 14:00) [3]
> > hInstance := hInstance; <---
Нать это, во-ще, к делу не относится, бо этого
класса окна создавать и не пытаются.
--
Regards, LVT.
ага0 (2008-05-26 14:00:00) [18]МистерТ дело грит. Вот здесь нать hInstance модуля с WindowProc
> with wnd do begin
> cbSize := SIZEOF (wnd);
> lpfnWndProc := WindowProc;
> hInstance := hInstance; <---
Leonid Troyanovsky (2008-05-26 09:22:00) [19]
> xaxatun (26.05.08 06:16)
> handle, почему? если скопировать в модуль программы - работает
Г.Х.Андерсен.
> МистерТ (26.05.08 09:04) [1]
> hInstance из .exe передавай в .dll
Начинать надо с Win32Check.
Или, хотя бы, с передачи класса в CWE.
--
Regards, LVT.
МистерТ (2008-05-26 09:04:00) [20]hInstance из .exe передавай в .dll