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

Вниз

Криво работает окно в dll при вызове из VCL exe   Найти похожие ветки 

 
parovoZZ ©   (2006-05-13 13:50) [0]

В ресурсах dll создал окно (в секции DIALOG), но при вызове оттуда работает криво: не двигается за шапку, все элементы съехали вниз, при потере фокуса обратно он не возвращается, хотя кнопки нажимаются, текст вводится. Может там надо создать своё родительское окно, а не передавать в качестве родителя хендл главной формы exe?

function LoginProc (DlgHandle: THandle; Msg, wParam, lParam: Integer) : integer; stdcall; export;
begin
case Msg of

  WM_COMMAND :
   case wParam of

    OK_Button :                          
      begin                      
       SendMessage (Handle, WM_LOGIN, WM_OK, 0);
       DestroyWindow (DlgHandle);
      end;

    Cancel_Button :
      begin
       DestroyWindow (Handle);
      end;
   end;

  WM_SYSCOMMAND :
   case wParam of

    SC_Close :
     begin
      DestroyWindow (Handle);
     end;
   end;

end;
Result := DefWindowProc (DlgHandle, Msg, wParam, lParam);
end;



 
Dstr ©   (2006-05-13 14:16) [1]

Попробуй с помощью    //При создании класса
hwnd = CreateWindow(szAppName, "TCP_IP",
                 WS_SYSMENU|WS_MINIMIZEBOX|WS_TILED,
     300, 200,
     400, 350,
                 NULL, NULL, hInstance, NULL) ;

//А ето в месагах как ты уже наверно понял,ето си,но смысл один...

case WM_CREATE:

   hwndServer=CreateWindow("button","Create server",
      WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON,
      2,225,100,25,
      hwnd,(HMENU)IDC_Server,hInst,NULL);

   hwndSend=CreateWindow("button","SendMsg",
      WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON,
      250,225,100,25,
      hwnd,(HMENU)IDC_Send,hInst,NULL);

   hwndDisconnect=CreateWindow("button","Disconnect",
      WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON,
      250,265,100,25,
      hwnd,(HMENU)IDC_Disconnect,hInst,NULL);

   hwndEdit_Ip = CreateWindowEx (WS_EX_CLIENTEDGE,"Edit","127.0.0.1",
                           WS_CHILD | WS_VISIBLE|
                           ES_LEFT ,
                           110,265,130,25, hwnd,(HMENU)EDIT_IPID,hInst, NULL);

   hwndClient=CreateWindow("button","Connect",
      WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON,
      2,265,100,25,
      hwnd,(HMENU)IDC_Client,hInst,NULL);

   LoadLibrary ( "RICHED32.DLL");
   hwndEdit = CreateWindowEx (WS_EX_CLIENTEDGE,RICHEDIT_CLASS, NULL,
                           WS_CHILD | WS_VISIBLE|WS_VSCROLL|
                           ES_LEFT | ES_MULTILINE |ES_READONLY|
                           ES_AUTOVSCROLL,
                           0, 0, 390, 120, hwnd,(HMENU)EDITID,hInst, NULL);
   
   hwndEditSend = CreateWindowEx (WS_EX_CLIENTEDGE,RICHEDIT_CLASS, NULL,
                           WS_CHILD | WS_VISIBLE|WS_VSCROLL|
                           ES_LEFT | ES_MULTILINE |
                           ES_AUTOVSCROLL,
                           0,130, 390,60, hwnd,(HMENU)EDITSENDID,hInst, NULL);

   hwndSB=CreateStatusWindow(WS_CHILD | WS_VISIBLE |
                           WS_CLIPSIBLINGS | CCS_BOTTOM |SBARS_SIZEGRIP,"Not connected",
      hwnd,IDC_SB);

  SendMessage(hwndEdit, EM_LIMITTEXT, 1024 * 1024, 0);
  SendMessage(hwndEditSend, EM_LIMITTEXT, 1024 * 1024, 0);


 
n0name   (2006-05-13 14:48) [2]

case ...
else
Result := DefWindowProc (DlgHandle, Msg, wParam, lParam);
end;


 
parovoZZ ©   (2006-05-13 19:25) [3]

У меня в dll класс не создаётся. Я вот и спрашиваю - надо ли это?

А если в делфях создавать элементы в рантайм, то не подхватывается XP манифест. Да и зачем, если у меня есть Resource Workshop.


 
Dstr ©   (2006-05-13 20:57) [4]

А ты используешь DLL по LoadLibrary и либа тупо загружается со всеми диалогами,такая система,да?


 
parovoZZ ©   (2006-05-13 21:57) [5]

LoadLibrary, далее нахожу точку входа и понеслась. Но проблема в том, как из VCL приложения вызвать API dll. По ходу дела надо тама цикл обработки сообщений организовать с диспетчером сообщений. А то не двигается окно, хоть тресни. MessageBox, мать его ити, работает же как-то.


 
parovoZZ ©   (2006-05-14 01:26) [6]

Ура!!!
function LoginProc (DlgHandle: THandle; Msg, wParam, lParam: Integer) : boolean; stdcall; export;

так надо делать в случае с CreateDialog ()

Теперь вопрос, как его сделать аналогично ShowModal ? А то ничего не помогает - всё равно доступна форма родителя.


 
n0name   (2006-05-14 09:45) [7]

SendMessage(hParent, WM_CANCELMODE, 0, 0);
Можешь ещё попробовать WM_ENABLE.


 
begin...end ©   (2006-05-14 09:51) [8]

> parovoZZ ©   (14.05.06 01:26) [6]
> Теперь вопрос, как его сделать аналогично ShowModal ?

DialogBox ?

> n0name   (14.05.06 09:45) [7]
> Можешь ещё попробовать WM_ENABLE.

Это следствие, а не причина. Тогда уж EnableWindow.


 
n0name   (2006-05-14 12:56) [9]


> Это следствие, а не причина. Тогда уж EnableWindow.

Разница не велика.


 
begin...end ©   (2006-05-14 14:05) [10]

> n0name   (14.05.06 12:56) [9]

В смысле? Вы можете задизаблить окно, послав ему WM_ENABLE?


 
n0name   (2006-05-14 18:02) [11]

конечно.

WM_ENABLE

   WPARAM wParam
   LPARAM lParam;
Parameters

wParam
Specifies whether the window has been enabled or disabled. This parameter is TRUE if the window has been enabled or FALSE if the window has been disabled.
lParam
This parameter is not used.
Return Value


 
begin...end ©   (2006-05-14 18:17) [12]

> n0name   (14.05.06 18:02) [11]

> конечно.

Я Вам завидую -- у меня этого сделать не получается.

Но... может быть, лучше всё же проверить?

It is sent to the window whose enabled state is changing. This message is sent before the EnableWindow function returns, but after the enabled state (WS_DISABLED style bit) of the window has changed.


 
parovoZZ ©   (2006-05-14 18:39) [13]

Если я правильно понял, то надо делать так:

  WM_Destroy : EndDialog (DlgHandle, {?});
Но что ставить вместо знака вопроса?


 
begin...end ©   (2006-05-14 18:52) [14]

> parovoZZ ©   (14.05.06 18:39) [13]

> WM_Destroy
?

> Но что ставить вместо знака вопроса?
То, что должна возвратить функция DialogBox.


 
begin...end ©   (2006-05-14 18:58) [15]

> parovoZZ

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/windowing/dialogboxes/usingdialogboxes.asp


 
parovoZZ ©   (2006-05-14 21:49) [16]

Тогда совсем не понятно, как брать Handle DialogBox :


DlgHandle := DialogBox (hInstance, "LOGIN", MainHandle, @LoginProc);


В таком виде он отваливается за пределами оконной функции

на ссылке ослик виснет, в опере не открывается


 
begin...end ©   (2006-05-14 22:00) [17]

> parovoZZ ©   (14.05.06 21:49) [16]

> Тогда совсем не понятно, как брать Handle DialogBox

За пределами диалоговой процедуры DialogProc он и не нужен -- когда DialogBox завершится, диалог уже закроется. А в DialogProc дескриптор диалога приходит как параметр каждый раз, когда она вызывается системой для обработки сообщения. Что же ещё нужно-то?

> на ссылке ослик виснет

Это какой-то неправильный ослик. У меня не виснет...


 
parovoZZ ©   (2006-05-14 23:43) [18]

А как тогда быть с этим:
procedure PostInfo (var edLogin, edPassword : string); stdcall;
var
Text : array [0..20] of Char;

begin
GetDlgItemText (DlgHandle, Login_Edit, Text, 20);
edLogin := Text;
GetDlgItemText (DlgHandle, Password_Edit, Text, 20);
edPassword := Text;
end;

Не зная хендла я не смогу прочитать данные.


 
n0name   (2006-05-15 07:54) [19]


> Но... может быть, лучше всё же проверить?

Блин, я был не прав.
> В таком виде он отваливается за пределами оконной функции

Это как отваливается?


 
parovoZZ ©   (2006-05-15 09:19) [20]

Стоит вызвать PostInfo <см выше> , DlgHandle обнуляется.


 
n0name   (2006-05-15 10:46) [21]


> Стоит вызвать PostInfo <см выше> , DlgHandle обнуляется.

Ты же нигде не присваеваешь DlgHandle ничего?
Странно, проверь код.


 
begin...end ©   (2006-05-15 11:09) [22]

> parovoZZ ©   (14.05.06 23:43) [18]

А с этим быть так: по нажатию кнопки "ОК" внутри диалоговой процедуры получать тексты edit"ов и запоминать их во внешних переменных, которые будут доступны после того, как DialogBox завершится.

А ещё лучше всё-таки починить ослика и зайти по ссылке в [15]. Потому что Вы ещё не задали ни одного вопроса, на который там не было бы ответа.


 
parovoZZ ©   (2006-05-15 19:55) [23]

Не открывается ссылка, хоть тресни. Пишет ошибку - невозможно создать объект сервером там чего-то. Завтра на работе попробую.


 
parovoZZ ©   (2006-05-15 19:59) [24]

WM_Destroy : EndDialog (DlgHandle, {?}); -> WM_Destroy : EndDialog (DlgHandle, DlgHandle);???
Ни в какие ворота не лезет :)


 
parovoZZ ©   (2006-05-15 20:56) [25]

Всё, с хeндлом разобрался. Там надо было явно передавать его из оконной процедуры. Но есть другая ерунда:
case msg.wParam of

 WM_OK     : begin
              @PostInfo := GetProcAddress (HandleDll, "PostInfo");
              if @PostInfo <> nil then PostInfo (edLogin, edPassword);
              FreeLibrary (HandleDll);
              login := edLogin;     <<-Access Violatin
              User := edPassword;
//
             end;

В DLL :


procedure GetInfo (Handle : THandle);
var
Text : array [0..20] of Char;

begin
GetDlgItemText (Handle, Login_Edit, Text, 20);
edLogin := Text;
GetDlgItemText (Handle, Password_Edit, Text, 20);
edPassword := Text;
end;

procedure PostInfo (var aLogin, aPassword : string); stdcall;
begin
aLogin := edLogin;
aPassword := edPassword;
end;


Нельзя что ли возвращать значение переменной из dll ?


 
parovoZZ ©   (2006-05-15 22:10) [26]

МОЖНО ВСЁ!!!

Заменил String на ShortString и всё запахало.

А вот как по-другому перехватить нажатие кнопки в dll и отправить данные в exe? Как-то навароченно получилось.


 
parovoZZ ©   (2006-05-18 21:17) [27]

А мне тут подсказали, что надо регистрировать доморощенные сообщения в системе, если работаешь с VCL
RegisterWindowMessage ("WM_Login");

А вот видел исходник на апях, так там просто
Const
WM_LOGIN = WM_APP + цЫфра.

Кто прав?

//Причём на VCL по последнему методу путаются wParam и lParam.


 
Игорь Шевченко ©   (2006-05-19 09:27) [28]


> Кто прав?


Оба.


 
parovoZZ ©   (2006-05-19 18:38) [29]

А ещё вопрос

FreeLibrary порождает сообщение WM_DESTROY для DLL? Или надо отлавливать Dll_Process_Detach?


 
Leonid Troyanovsky ©   (2006-05-19 18:44) [30]


> parovoZZ ©   (19.05.06 18:38) [29]

> FreeLibrary порождает сообщение WM_DESTROY для DLL?


Нет, ясен пень.

> Или надо отлавливать Dll_Process_Detach?


Почему "или"? В чем связь?
Извольте изъясняться доступней.

--
Regards, LVT.


 
parovoZZ ©   (2006-05-20 15:43) [31]

Ну при выгрузке библиотеки надо вызывать EndDialog или нет?


 
Leonid Troyanovsky ©   (2006-05-21 17:53) [32]


> parovoZZ ©   (20.05.06 15:43) [31]

> Ну при выгрузке библиотеки надо вызывать EndDialog или нет?


Вызывай.
А при чем тут сабж?

--
Regards, LVT.


 
parovoZZ ©   (2006-05-22 00:39) [33]

Ну получается, что о выгрузке библиотеки я узнаю только через Dll_Process_Detach. ОКНО в DLL у меня уже создано.


 
Leonid Troyanovsky ©   (2006-05-22 18:49) [34]


> parovoZZ ©   (22.05.06 00:39) [33]

> Ну получается, что о выгрузке библиотеки я узнаю только
> через Dll_Process_Detach. ОКНО в DLL у меня уже создано.


И?
Окна, вообще-то, собственность потока.
Место их создания на высоту полетов не влияет.

--
Regards, LVT.


 
parovoZZ ©   (2006-05-22 20:11) [35]

Ну?

Так как убить окно в dll при выгрузке библиотеки?

Так, а при статической загрузке dll при её выгрузке (завершении работы приложения) само всё отвалится или тоже надо явно освобождать?


 
Leonid Troyanovsky ©   (2006-05-22 21:35) [36]


> parovoZZ ©   (22.05.06 20:11) [35]

> Ну?


Гну.

> Так как убить окно в dll при выгрузке библиотеки?

Вот, скажи, и как это при  модально показанном окне
будет происходить выгрузка библиотеки?

Нет, конечно, представить и такое можно, но,
в этом случае, ты сам себе злобный буратино.

--
Regards, LVT.


 
parovoZZ ©   (2006-05-23 00:26) [37]

Сильно :)

Очень просто
Ловлю мессагу о нажатии кнопки в окне из dll и выгружаю библиотеку без предупреждения. А в оконном обработчике по этому событию окно не убивается.
WM_Cancel : FreeLibrary (HandleDll)

Что будет с памятью?

На самом деле окно будет не модальным, потому как сперва будет появляться окошко авторизации, а уже потом всё остальное. Сейчас буду ныть в соседнем топике, как это реализовать в dll.))


 
Leonid Troyanovsky ©   (2006-05-23 06:57) [38]


> parovoZZ ©   (23.05.06 00:26) [37]

> Ловлю мессагу о нажатии кнопки в окне из dll и выгружаю
> библиотеку без предупреждения. А в оконном обработчике по
> этому событию окно не убивается.
> WM_Cancel : FreeLibrary (HandleDll)


Сильно. Это притом, что оконная процедура в библиотеке.
Конечно же, буратино.

--
Regards, LVT.


 
parovoZZ ©   (2006-05-23 09:22) [39]

А где ей ещё быть?
Ну ладно, обсуждение плавно перешло в перебранку.


 
Polevi ©   (2006-05-23 09:43) [40]

нефиг сук пилить на котором сидишь



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

Форум: "WinAPI";
Текущий архив: 2006.10.15;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.57 MB
Время: 0.044 c
2-1158159223
darlock
2006-09-13 18:53
2006.10.15
Копирование тектса из одного TRichEdit-а в другой


15-1158737267
Ega23
2006-09-20 11:27
2006.10.15
С Днём рождения! 20 сентября


15-1158921694
Aust
2006-09-22 14:41
2006.10.15
сканер


15-1158938470
ZMRaven
2006-09-22 19:21
2006.10.15
сотовые


2-1159698030
redlord
2006-10-01 14:20
2006.10.15
listbox выводить текст разным цветом





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