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

Вниз

не возвр. 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.043 c
2-1212041779
Smile
2008-05-29 10:16
2008.06.22
TFooClass


9-1171442617
Vemer
2007-02-14 11:43
2008.06.22
Удаление объектов OpenGL


15-1210753383
Vlad Oshin
2008-05-14 12:23
2008.06.22
настроить редактор для заготовок кода


15-1210661850
Лимпопо
2008-05-13 10:57
2008.06.22
Учет трафика Firebird


2-1212044582
IntruderLab
2008-05-29 11:03
2008.06.22
Дочерние окна





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский