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

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.03 c
2-1165066392
ssss
2006-12-02 16:33
2006.12.24
Слова перевертыши


1-1163143153
Sergey__
2006-11-10 10:19
2006.12.24
Работа со считывателем HID iClass


2-1164702053
Mishenka
2006-11-28 11:20
2006.12.24
Повторный запуск программы


15-1164924537
Германн
2006-12-01 01:08
2006.12.24
Чисто для смеха


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