Форум: "Начинающим";
Текущий архив: 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