![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
DLL
sergeyst © (2006-12-06 09:07:00)Всем привет.
Вызываю форму из 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 написана. Подскажите в чем проблемма
Desdechado (2006-12-06 17:14:00) [1]> Все же, объясните, что это такое
Это в продолжение темы о том, что Application у DLL свой. И на время выполнения визуальных (и не только) манипуляций лучше его совместить с главным от приложения. Нотолько хэндл, иначе при выходе из DLL в твоем варианте Application DLL разрушается, что равно разрушению Application основного приложения.
ЗЫ имхо, код достаточно прозрачен, чтоб его понять.
sergeyst (2006-12-06 16:50:00) [2]
> Loginov Dmitry © (06.12.06 15:49) [25]
> Сомнительный и весьма опасный код.
Согласен. Переделал.
Loginov Dmitry (2006-12-06 15:49:00) [3]> if FileExists('S:\' + FolderTreeView.Selected.Text + '\'
> + FilesListView.Selected.Caption) then
> ошибка на строке 2.
Сомнительный и весьма опасный код.
sergeyst (2006-12-06 14:03:00) [4]
> Сергей М. © (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.
sergeyst (2006-12-06 13:57:00) [5]
> 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;
Все же, объясните, что это такое
Anatoly Podgoretsky (2006-12-06 13:20:00) [6]> Сергей М. (06.12.2006 13:15:21) [21]
А можно и обрабатывать ошибки, что гораздо эффективнее, чем трассировать.
Сергей М. (2006-12-06 13:15:00) [7]
> не знаю как
Пошаговой трассировкой своего кода
sergeyst (2006-12-06 13:14:00) [8]
> Desdechado © (06.12.06 12:34) [18]
Можно прокомментировать?
sergeyst (2006-12-06 13:12:00) [9]
> Сергей М. © (06.12.06 12:34) [17]
>
> > вылазит ошибка. Как этого избежать?
> >
>
>
> Исправить причину ошибки.
Я не знаю как
Desdechado (2006-12-06 12:34:00) [10]
function doC32Transform( App: HWND ): CARDINAL; stdcall;
var
hOldHandle: HWND;
begin
hOldHandle := Application.Handle;
Application.Handle := App;
result := ProcessData();
Application.Handle := hOldHandle;
end;
Сергей М. (2006-12-06 12:34:00) [11]
> вылазит ошибка. Как этого избежать?
>
Исправить причину ошибки.
sergeyst (2006-12-06 12:18:00) [12]И еще в ListView нах-ся список файлов, по клику файл, если существует, загружается в Имидж или оле (зависит от типа), но, если кликнуть на пустой строчке, вылазит ошибка. Как этого избежать?
sergeyst (2006-12-06 12:14:00) [13]
> Desdechado © (06.12.06 12:05) [14]
1,2 - Ок.
3 -
Application := Appl;
Form1 := TForm1.Create(Application);
ничего не меняется.
И почему
> sergeyst © (06.12.06 12:02) [13] ?
Desdechado (2006-12-06 12:05:00) [14]1. DLL и программа должны быть скомпилированы одинаковой версией дельфи
2. соглашение о вызовах должно быть соблюдено
3. Application у программы и DLL разные, поэтому непонятныAppl: TApplication; и Form1 := TForm1.Create(Application);
sergeyst (2006-12-06 12:02:00) [15]
> Сергей М. © (06.12.06 11:32) [12]
>
> > по возвращении в вызывающую прогу
>
>
> До этого, как ты говоришь, дело даже не доходит - "вис"
> происходит уже на Form1.Free
Увы, да. Но почему?
Попробовал сделать другую прогу, принцип - тот же.
Все работает.
Сергей М. (2006-12-06 11:32:00) [16]
> по возвращении в вызывающую прогу
До этого, как ты говоришь, дело даже не доходит - "вис" происходит уже на Form1.Free
sergeyst (2006-12-06 11:16:00) [17]
> Anatoly Podgoretsky © (06.12.06 10:30) [7]
> > sergeyst (06.12.2006 10:13:05) [5]
>
> То есть вне зависимости загрузил библиотеку или нет, но
> Free делаешь :-)
Free нах-ся в вызываемой процедуре
sergeyst (2006-12-06 11:15:00) [18]
> Сергей М. © (06.12.06 10:39) [9]
Если в библ запихнуть DAtaBase и Transaction, то все Ок. Думаю, что Query как-то изменяет состояние database или transaction и, по возвращении в вызывающую прогу, она(прога) обнаруживает не то, что ожидалось? Может такое быть?
Сергей М. (2006-12-06 10:39:00) [19]А если так:
Form1 := TForm1.Create(nil);
with Form1 do
try
finally
Free;
end;
виснет ?
sergeyst (2006-12-06 10:31:00) [20]
> Сергей М. © (06.12.06 10:24) [6]
> Что значит "после" ?
т.е. на ней и виснет