Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2009.09.20;
Скачать: [xml.tar.bz2];

Вниз

InterBase и FreeLibrary   Найти похожие ветки 

 
asafr   (2008-07-04 15:42) [0]

Существует DLL, взаимодействующая с интербейзом... DLL подключается динамически из основной программы и имеет модальную форму... В случае, если в запросе DLL к IB происходит ошибка - генерируется исключение, выдается предупреждение об ошибке, DLL завершает работу по Exception... Далее, главная программа после завершения работы библиотеки доходит до фунуции FreeLibrary(hndl) - и намертво виснет...  
Если же исключение в библиотеке генерируется не в результате ошибки запроса, а по другой причине - FreeLibrary в главной программе отрабатывает корректно.
Понятно, что скорее всего какой-то "хвост" остается от связки DLL-IB, который не дает выгрузить библиотеку из памяти. Но какой?
Операционная система WinXP Sp2
                                Delphi 2007
Код библиотеки в очень сильно упрощенном виде выглядит так:

..............................................
var  _HandleOwnerApp     :THandle;
.............................................
..............................................

procedure DllMain(fdwReason:DWORD);
begin
  case fdwReason of
    DLL_THREAD_ATTACH: ;
    DLL_THREAD_DETACH: ;
    DLL_PROCESS_ATTACH: begin
                                     ....................
                                     ...................
                                     CoInitialize(nil);
                                     end;
    DLL_PROCESS_DETACH: begin
                                     DModule.IBDB.Close;
                                     DModule.Free;
                                     CoUnInitialize;
                                     end;
  end;
end;

function ShowRep(DVar:Variant):Variant; StdCall;
var ...................
    ....................
begin
   _HandleOwnerApp := Application.Handle;
    Application.Handle := DVar[0]; //HandleCallApp;
    if not Assigned(DModule) then DModule := TDModule.Create(DModule);
    DModule.IBDB.DatabaseName := DVar[2]; //ConnectionString IBDataBase
    ...........................................................
   ...........................................................
    with TfmListReports.Create(nil)  do
    begin
      try
        .................................
        ..................................

        if ShowModal = mrOK then
        begin
          .....................
          .......................
          Query.Open; //Запрос с ошибкой
          ........................
          ........................
          Free;
          DModule.IBDB.Close;
          DModule.Free;
          Result := VarArrayOf([1,null,null]);
        end;            
      except
        on E:Exception do
        begin
          CreateDialog("Ошибка!", E.Message , mtError, [mbYes], poOwnerFormCenter);
          Result := VarArrayOf([0,null,null]);
          Free;
          DModule.IBDB.Close;
          DModule.Free;
          CoUnInitialize;
        end;
      end;
    end;
end;

exports ShowRep;

begin
DllProc := @DllMain;
DllMain(DLL_PROCESS_ATTACH);
end.


На самом деле, буду рад любому совету, который хотя бы даст направление в поисках решения этой проблемы.
Заранее спасибо.


 
Sashka   (2008-07-04 15:54) [1]

except
       on E:Exception do
       begin
         CreateDialog("Ошибка!", E.Message , mtError, [mbYes], poOwnerFormCenter);
         Result := VarArrayOf([0,null,null]);
         Free;
         DModule.IBDB.Close;
        DModule.Free;
         CoUnInitialize;
       end;
     end;

DLL_PROCESS_DETACH: begin
                                    DModule.IBDB.Close;
                                    DModule.Free;
                                    CoUnInitialize;
                                    end;


 
Сергей М. ©   (2008-07-04 15:59) [2]

Жуткая каша)..

Уже язык отсох спрашивать - зачем тут stdcall ?


 
asafr   (2008-07-04 16:08) [3]

Sashka, то, что выделил мне жирным - не влияет на суть проблемы..
На самом деле в exception в программе
строки
DModule.IBDB.Close;
DModule.Free  - отсутствуют. Просто в форуме не очень удобно писать код... Как они там очутились в коде поста - самому не понятно!  :)
Сергей М., мудрый человечище, так  подскажи! Авось, язык не отсохнет..
На этом форуме я посетитель редкий и частым быть не собираюсь - поэтому следить за твоими ответами - мне нет ни силЮ ни времени: очень много работы..


 
Сергей М. ©   (2008-07-04 16:13) [4]


> подскажи!


Сначала скажи, откуда и зачем оно у тебя взялось ..


> не влияет на суть проблемы


Еще как влияет)


 
Сергей М. ©   (2008-07-04 16:14) [5]


> Как они там очутились в коде поста - самому не понятно


Равно как ни тебе ни нам непонятно и появление stdcall)


 
asafr   (2008-07-04 16:21) [6]

stdcall - ключевое слово. Благодаря нему, вместо боллее эффективной методики передачи параметров, используемой Delphi по умолчанию (ключевое слово register), используется методика передачи параметров, применяемая в Win32. stdcall - можно не применять, если обращение к библиотеке происходит из приложения, написанного на Delphi. Тебе это объяснить?


 
asafr   (2008-07-04 16:22) [7]

Кстати, при работе аналогичной библиотеки с MS SQL Server - подобной проблемы при ошибке запроса не возникает....


 
Сергей М. ©   (2008-07-04 16:31) [8]


> stdcall - можно не применять, если обращение к библиотеке
> происходит из приложения, написанного на Delphi


А зачем же тогда применяешь ? Тем более если Pascal fastcall более эффективно ?


 
Сергей М. ©   (2008-07-04 16:33) [9]

И - уж сколько раз твердили миру  - дельфийским формам не место в dll, для них придуманы bpl !


 
asafr   (2008-07-04 16:45) [10]

:)
Спасибо, Сергей М.! А знаешь, что есть такие понятия, как "техническое задание" и "пожелания заказчика"? А так же, сложившийся исторически процесс написания проекта, которому уже несколько лет и где модульность поддерживается с помощью DLL..
А так должна быть предусмотрена возможность вызова библиотеки не только из Дельфовых приложений, но из приложения, написанных на C++ и VB? Видимо, не слышал.. Или не приходилось работать в таких организациях, между прочим - весьма серьезных.. Cразу все вешаешь на свою колокольню.
Как я понял - по сути вопроса ответа ты мне дать не можешь...
Но не переживай - многие не могут. В различных форумах встречаются вопросы по этой проблеме (не только Дельфийские форумы) - но с ответами там туго...


 
Sashka   (2008-07-04 16:50) [11]


> На самом деле в exception в программе
> строки
> DModule.IBDB.Close;
> DModule.Free  - отсутствуют. Просто в форуме не очень удобно
> писать код... Как они там очутились в коде поста - самому
> не понятно!  :)


)) Зачет

А Эксепшен то (не интербейзовский) в том же куске кода-то хоть генерируется тоже???


 
asafr   (2008-07-04 16:53) [12]

а как же?


 
asafr   (2008-07-04 16:54) [13]

Ладно.. Тема закрыта... Буду "рыть" сам.. Спасибо за посильную помощь...


 
Сергей М. ©   (2008-07-04 16:55) [14]


> должна быть предусмотрена возможность вызова библиотеки
> не только из Дельфовых приложений, но из приложения, написанных
> на C++ и VB? Видимо, не слышал


Я-то слышал.

А вот ты , видимо, не слышал, что, к примеру, дельфийский тип Variant не совместим с одноименным типом в VB. А ты этот тип ничтоже сумняшеся тычешь параметром и результатом своей функции.
Кр.того, нет никакой гарантии, что твой код будет работать, если тебе передадут параметром хэндл окна недельфийского приложения.

Вот тебе и "по сути")


 
Сергей М. ©   (2008-07-04 16:57) [15]

А вот тебе еще грабли - ты не придаешь НИКАКОГО значения тому. в КАКОМ кодовом потоке хост-процесса будет инициализирована твоя билиотека и в каком потоке вызвана твоя ф-ция в ее составе.


 
Сергей М. ©   (2008-07-04 16:58) [16]

Так что текущие грабли - это только грабельки.
А граблища у тебя еще впереди)


 
Сергей М. ©   (2008-07-04 17:01) [17]


> очень много работы


Что, и на изучение возможностей встр.отладчика времени не хватает ? Или желания ?)

Ведь место "виса" с его помощью выясняется самостоятельно и элементарно)


 
asafr   (2008-07-05 01:31) [18]

Удалено модератором



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2009.09.20;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.51 MB
Время: 0.006 c
15-1248441684
b z
2009-07-24 17:21
2009.09.20
Потоп


15-1248209018
Keph
2009-07-22 00:43
2009.09.20
Delphi demos


2-1247647847
Dmitriy
2009-07-15 12:50
2009.09.20
Строка инициализации модема


1-1215171753
asafr
2008-07-04 15:42
2009.09.20
InterBase и FreeLibrary


3-1227447785
otan
2008-11-23 16:43
2009.09.20
Настройка DBSumList





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский