Главная страница
    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.04 c
3-1160633869
svt
2006-10-12 10:17
2006.12.24
Подскажите пожайлусата как правильно и рационально


15-1165004469
СтьюдентЪ
2006-12-01 23:21
2006.12.24
Проблема с компьютером


11-1142433325
Godness
2006-03-15 17:35
2006.12.24
Странное сворачивание формы при использовании KOLApplet


6-1153807004
verybadbug
2006-07-25 09:56
2006.12.24
работа с IIS


2-1165249328
Tort
2006-12-04 19:22
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
Английский Французский Немецкий Итальянский Португальский Русский Испанский