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

Вниз

не возвр. handle, почему?   Найти похожие ветки 

 
xaxatun   (2008-05-26 06:16) [0]

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"ке нет, в чем может быть причина?


 
МистерТ   (2008-05-26 09:04) [1]

hInstance из .exe передавай в .dll


 
Leonid Troyanovsky ©   (2008-05-26 09:22) [2]


> xaxatun   (26.05.08 06:16)  

> handle, почему? если скопировать в модуль программы - работает

Г.Х.Андерсен.

> МистерТ   (26.05.08 09:04) [1]

> hInstance из .exe передавай в .dll

Начинать надо с Win32Check.
Или, хотя бы, с передачи класса в CWE.

--
Regards, LVT.


 
ага0   (2008-05-26 14:00) [3]

МистерТ дело грит. Вот здесь нать hInstance модуля с WindowProc

>  with wnd do begin
>    cbSize        := SIZEOF (wnd);
>    lpfnWndProc   := WindowProc;
>    hInstance     := hInstance; <---


 
Leonid Troyanovsky ©   (2008-05-26 16:09) [4]


> ага0   (26.05.08 14:00) [3]

> >    hInstance     := hInstance; <---

Нать это, во-ще, к делу не относится, бо этого
класса окна создавать и не пытаются.

--
Regards, LVT.


 
ага0   (2008-05-26 16:14) [5]


> Нать это, во-ще, к делу не относится, бо этого
> класса окна создавать и не пытаются.

А какого пытютьси?


 
Leonid Troyanovsky ©   (2008-05-26 16:26) [6]


> ага0   (26.05.08 16:14) [5]

> А какого пытютьси?

Хз, зри код.

--
Regards, LVT.


 
ага0   (2008-05-26 16:48) [7]

Я иль окончательно ослеп иль столь же окончательно поглупел ( что в прынцыпу равновероятно) - не вижу:(

> lpszClassName := "x";

> Result := Windows.CreateWindowEx (WS_EX_APPWINDOW, "x",

Не оно? Аль чет ишшо не так?


 
ага0   (2008-05-26 16:52) [8]

А!!! Я понял, понял!!!
:)))
Ты про то, шо результ регистрации класса не проверяется! Ну дата, ага. Однако-ж думается, что он из-за инстанции и не проходить


 
Leonid Troyanovsky ©   (2008-05-26 18:31) [9]


> ага0   (26.05.08 16:52) [8]

> и не проходить

Чего гадать, пусть зовет Win32Check.
Класс и окно, очевидно, что в одном модуле.

--
Regards, LVT.


 
dev   (2008-05-26 18:57) [10]

спасибо, не работало из за instance.


 
Leonid Troyanovsky ©   (2008-05-26 19:08) [11]


> dev   (26.05.08 18:57) [10]

Ты-то кто? Мало ли что у кого не работает.
Код показывай.

--
Regards, LVT.


 
xaxatun   (2008-05-26 19:15) [12]

спасибо, не работало из за instance.


 
Leonid Troyanovsky ©   (2008-05-26 19:38) [13]


> xaxatun   (26.05.08 19:15) [12]

> спасибо, не работало из за instance.

Любопытно.

--
Regards, LVT.


 
МистерТ   (2008-05-26 19:56) [14]

> 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 - то все прекрасно работает.


 
ага0   (2008-05-26 21:20) [15]

2 МистерТ

Да че б ей быть нулем? Нормальная там hInstance, тока в ей адрес загрузки самой библиотеки. А для RegisterClassEx треба шоб в TWndClassEx.hInstance был адрес того модуля, куда кажить TWndClassEx.lpfnWndProc. Он жеж функцию из экзешника передает, экзешника hInstance и нужон. А тут ваще самому себе себя присваиват

>  with wnd do begin
>    cbSize        := SIZEOF (wnd);
>    lpfnWndProc   := WindowProc;
>    hInstance     := hInstance;

ет означает
wnd.hInstance:=wnd.hInstance
натурально как был ноль так и остался:) Вот такие пироги.


 
ага0   (2008-05-26 21:28) [16]

А. Да. Про ноль забыл сказать, ага. Экзешник по нижним адресам грузится, мот потому наверна ноль и прокатывает и при вызове из экзешника. А мож она ноль как дефолт принимает и сама экзешник подставляет, типа того. Да не пофиг ли почему, главно принимает:)


 
Leonid Troyanovsky ©   (2008-05-26 22:15) [17]


> МистерТ   (26.05.08 19:56) [14]

> hInstance = 0, поэтому функция регистрации класса завершается
> успешно, а создание окна возвращает "неверный параметр".

Все это неубедительно без указания места и вида WindowProc.

--
Regards, LVT.


 
Leonid Troyanovsky ©   (2008-05-26 22:33) [18]


> 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.


 
Loginov Dmitry ©   (2008-05-26 23:22) [19]

> Уже не однократно сталкивался, что в .dll созданных в Delphi
> hInstance = 0, поэтому функция регистрации класса завершается
> успешно, а создание окна возвращает "неверный параметр".
> Возможно это такая особенность компилятора, возможно я чего-
> то недопонимаю, почемк так. Но если передать из приложения
> ссылку на hInstance .exe - то все прекрасно работает.


Компилятор непричем. Класс окна - структура, состоящая из имени, различных параметров, адреса оконной функции и hInstance. При создании окна указывается имя класса и hInstance (без адреса оконной функции). При вызове функции CreateWindows() Windows выполняет поиск производного класса окна, только среди классов, зарегистрированных в данном приложении. В приложении может быть (и будет) сколько угодно одноименных оконных классов (но hInstance у всех разные). Для поиска используются параметры "имя класса" и hInstance. hInstance - может быть любое (произвольное) число. Оно используется для того, чтобы найти класс с требуемой оконной функцией (если класс зарегистрирован в какой-то конкретной DLL (закреплен за DLL), то функция CreateWindows() (обычно) должна обращаться именно к этому классу). Может и мутно написано, но основной смысл в этом, остальное - в хэлпе.


 
Loginov Dmitry ©   (2008-05-26 23:23) [20]

цитата не совсем правильная, ну надеюсь, что хоть в тему сказанул :)



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

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

Наверх




Память: 0.51 MB
Время: 0.018 c
2-1212085608
assassin8899
2008-05-29 22:26
2008.06.22
Locate


15-1210570323
Юрий Зотов
2008-05-12 09:32
2008.06.22
Защита ПК


1-1195206572
voe
2007-11-16 12:49
2008.06.22
IBQuery1 сколько столбцов вернул запрос?!


2-1212078169
Jeqa
2008-05-29 20:22
2008.06.22
DataSource


2-1211994788
assassin8899
2008-05-28 21:13
2008.06.22
Edit