Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

DLL


Страницы:   1 2

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]
> Что значит "после" ?

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


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо