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

Вниз

DLL   Найти похожие ветки 

 
sergeyst ©   (2006-12-06 09:07) [0]

Всем привет.
Вызываю форму из DLL, все работает, а после закрытия формы прога виснет.
Вызов:
procedure SA(NMK_ID: Integer);
var
 LibHandle: THandle;
 PrintDoc: TPrintDoc;
begin
 LibHandle := LoadLibrary("Print\projectdll.dll");
 try
   if LibHandle = 0 then
     ShowMessage("Íå óäàëîñü çàãðóçèòü áèáëèòåêó Print\projectdll.dll");
   @PrintDoc := GetProcAddress(LibHandle, "PrintDoc");
   if not (@PrintDoc = nil) then
     PrintDoc(Application, NMK_ID, DataModule1.IBDatabase1, DataModule1.IBTransaction1 );
 finally
   FreeLibrary(LibHandle);
 end;
end;
ShareMem написана. Подскажите в чем проблемма


 
Сергей М. ©   (2006-12-06 09:10) [1]


> Вызываю форму из DLL


Модально ?


 
sergeyst ©   (2006-12-06 09:13) [2]


> Сергей М. ©   (06.12.06 09:10) [1]

Да :
procedure PrintDoc(Appl: TApplication; NMK_ID: Integer; IBDataBase: TIBDataBase; IBTransaction: TIBTransaction);
begin
 Form1 := TForm1.Create(Application);
 with Form1 do begin
   IBQDoc.Database := IBDataBase;
   IBQDoc.Transaction := IBTransaction;
   DataSource1.DataSet := IBQDoc;
   IBQDoc.ParamByName("NMK_ID").AsInteger := NMK_ID;
   IBQDoc.Open;
   IBQDoc.First;
   DocSetup;
   ShowModal;
   IBQDoc.Close;
   Free;
 end;
end;


 
sergeyst ©   (2006-12-06 09:44) [3]

Ну, знает кто-нибудь?


 
Сергей М. ©   (2006-12-06 09:54) [4]

На какой строчке "виснет" ?


 
sergeyst ©   (2006-12-06 10:13) [5]

После Free


 
Сергей М. ©   (2006-12-06 10:24) [6]

Что значит "после" ?


 
Anatoly Podgoretsky ©   (2006-12-06 10:30) [7]

> sergeyst  (06.12.2006 10:13:05)  [5]

То есть вне зависимости загрузил библиотеку или нет, но Free делаешь :-)


 
sergeyst ©   (2006-12-06 10:31) [8]


> Сергей М. ©   (06.12.06 10:24) [6]
> Что значит "после" ?

т.е. на ней и виснет


 
Сергей М. ©   (2006-12-06 10:39) [9]

А если так:

Form1 := TForm1.Create(nil);
with Form1 do
try
finally
  Free;
end;

виснет ?


 
sergeyst ©   (2006-12-06 11:15) [10]


> Сергей М. ©   (06.12.06 10:39) [9]

Если в библ запихнуть DAtaBase и Transaction, то все Ок. Думаю, что Query как-то изменяет состояние database или transaction и, по возвращении в вызывающую прогу, она(прога) обнаруживает не то, что ожидалось? Может такое быть?


 
sergeyst ©   (2006-12-06 11:16) [11]


> Anatoly Podgoretsky ©   (06.12.06 10:30) [7]
> > sergeyst  (06.12.2006 10:13:05)  [5]
>
> То есть вне зависимости загрузил библиотеку или нет, но
> Free делаешь :-)

Free нах-ся в вызываемой процедуре


 
Сергей М. ©   (2006-12-06 11:32) [12]


> по возвращении в вызывающую прогу


До этого, как ты говоришь, дело даже не доходит - "вис" происходит уже на Form1.Free


 
sergeyst ©   (2006-12-06 12:02) [13]


> Сергей М. ©   (06.12.06 11:32) [12]
>
> > по возвращении в вызывающую прогу
>
>
> До этого, как ты говоришь, дело даже не доходит - "вис"
> происходит уже на Form1.Free

Увы, да. Но почему?
Попробовал сделать другую прогу, принцип - тот же.
Все работает.


 
Desdechado ©   (2006-12-06 12:05) [14]

1. DLL и программа должны быть скомпилированы одинаковой версией дельфи
2. соглашение о вызовах должно быть соблюдено
3. Application у программы и DLL разные, поэтому непонятны Appl: TApplication; и  Form1 := TForm1.Create(Application);


 
sergeyst ©   (2006-12-06 12:14) [15]


> Desdechado ©   (06.12.06 12:05) [14]

1,2 - Ок.
3 -
    Application := Appl;
    Form1 := TForm1.Create(Application);
ничего не меняется.
И почему
> sergeyst ©   (06.12.06 12:02) [13] ?


 
sergeyst ©   (2006-12-06 12:18) [16]

И еще в ListView нах-ся список файлов, по клику файл, если существует, загружается в Имидж или оле (зависит от типа), но, если кликнуть на пустой строчке, вылазит ошибка. Как этого избежать?


 
Сергей М. ©   (2006-12-06 12:34) [17]


> вылазит ошибка. Как этого избежать?
>


Исправить причину ошибки.


 
Desdechado ©   (2006-12-06 12:34) [18]

function doC32Transform( App: HWND ): CARDINAL; stdcall;
var
 hOldHandle: HWND;
begin
 hOldHandle := Application.Handle;
 Application.Handle := App;
 result := ProcessData();
 Application.Handle := hOldHandle;
end;


 
sergeyst ©   (2006-12-06 13:12) [19]


> Сергей М. ©   (06.12.06 12:34) [17]
>
> > вылазит ошибка. Как этого избежать?
> >
>
>
> Исправить причину ошибки.

Я не знаю как


 
sergeyst ©   (2006-12-06 13:14) [20]


> Desdechado ©   (06.12.06 12:34) [18]

Можно прокомментировать?


 
Сергей М. ©   (2006-12-06 13:15) [21]


> не знаю как


Пошаговой трассировкой своего кода


 
Anatoly Podgoretsky ©   (2006-12-06 13:20) [22]

> Сергей М.  (06.12.2006 13:15:21)  [21]

А можно и обрабатывать ошибки, что гораздо эффективнее, чем трассировать.


 
sergeyst ©   (2006-12-06 13:57) [23]


> Desdechado ©   (06.12.06 12:34) [18]


> function doC32Transform( App: HWND ): CARDINAL; stdcall;
>
> var
>  hOldHandle: HWND;
> begin
>  hOldHandle := Application.Handle;
>  Application.Handle := App;
>  result := ProcessData();
>  Application.Handle := hOldHandle;
> end;

Все же, объясните, что это такое


 
sergeyst ©   (2006-12-06 14:03) [24]


> Сергей М. ©   (06.12.06 13:15) [21]
>
> > не знаю как
>
>
> Пошаговой трассировкой своего кода

1)  if FilesListView.Items.Count > 0 then
2)      if FileExists("S:\" + FolderTreeView.Selected.Text + "\" +     FilesListView.Selected.Caption) then
ошибка на строке 2.


 
Loginov Dmitry ©   (2006-12-06 15:49) [25]

> if FileExists("S:\" + FolderTreeView.Selected.Text + "\"
> +     FilesListView.Selected.Caption) then
> ошибка на строке 2.


Сомнительный и весьма опасный код.


 
sergeyst ©   (2006-12-06 16:50) [26]


> Loginov Dmitry ©   (06.12.06 15:49) [25]


> Сомнительный и весьма опасный код.

Согласен. Переделал.


 
Desdechado ©   (2006-12-06 17:14) [27]

> Все же, объясните, что это такое
Это в продолжение темы о том, что Application у DLL свой. И на время выполнения визуальных (и не только) манипуляций лучше его совместить с главным от приложения. Нотолько хэндл, иначе при выходе из DLL в твоем варианте Application DLL разрушается, что равно разрушению Application основного приложения.

ЗЫ имхо, код достаточно прозрачен, чтоб его понять.



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

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

Наверх




Память: 0.51 MB
Время: 0.041 c
15-1165346981
Kerk
2006-12-05 22:29
2006.12.24
Google оцифрует российские библиотеки


6-1153916814
KyRo
2006-07-26 16:26
2006.12.24
TIdFtp


2-1165417135
alexa14
2006-12-06 17:58
2006.12.24
Значки в popupmenu


15-1165248006
oldman
2006-12-04 19:00
2006.12.24
Наши опять взяли Кубок Девиса...


2-1165315717
Winter
2006-12-05 13:48
2006.12.24
Добавить дату в цикле





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