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

Вниз

Ошибка выгрузки DLL   Найти похожие ветки 

 
Dynamit   (2002-09-16 14:45) [0]

Уважаемые мастера, у меня странный трабл! Собственно сабж.
Делаю простейшие вещи с DLL. Все получается, но при выгрузке происходит ошибка обращения к памяти (т.е. обьект воздействия не существует!?!).
Если есть какие мысли - подскажите сирому, не пожалейте времени ;(

Исходник вот:

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls;

type

TLoadJorn = Function (AHandle, FHandle: THandle):Longint; StdCall;
TUnLoadJorn = Procedure (ARef: LongInt); StdCall;

EDLLLoadError=class(Exception);

TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
Panel1: TPanel;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
LibHandle: THandle;
CurHndl: LongInt;
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
Var
LoadJorn: TLoadJorn;
begin
LibHandle:=LoadLibrary("JornDLL.Dll");
If LibHandle=0 Then
Raise EDLLLoadError.Create("Не могу загрузить DLL");
@LoadJorn:=GetProcAddress(LibHandle,"LoadJorn");
If Not (@LoadJorn=nil) Then
CurHndl:=LoadJorn(Handle, Panel1.Handle);
end;

procedure TForm1.Button2Click(Sender: TObject);
Var
UnLoadJorn: TUnLoadJorn;
begin
If LibHandle<>0 Then
Begin
@UnloadJorn:=GetProcAddress(LibHandle,"UnLoadJorn");
If Not (@UnloadJorn=nil) Then
Begin
UnloadJorn(CurHndl);
End;
If Not FreeLibrary(LibHandle) Then
Begin
ShowMessage("Error "+IntToStr(GetLastError));
End;
End;
end;

end.


 
Andre V.   (2002-09-16 14:56) [1]

Возможно, UnloadJorn не освобождает ресурсы из DLL


 
ZrenBy ©   (2002-09-16 15:02) [2]

А не пробовал
If FreeLibrary(LibHandle)=0 Then

В дельфи работа с Bool сделана очень дерьмово


 
Dynamit   (2002-09-16 15:11) [3]

Да там до проверки дело не доходит - виснет где-то внутри FreeLibrary. Может и правда с ресурсами...


 
REA   (2002-09-16 16:33) [4]

Еще параллельные threads могут завесить


 
Dynamit   (2002-09-16 16:44) [5]

Ресурсы проверил - вроде было местечко слабое (усилил)!
Но ошибка осталась!!

Буду пробовать упрощать DLL - посмотрю в чем глюк.


 
Dynamit   (2002-09-17 10:26) [6]

Вот блин!!
Упростил DLL донельзя - и все равно тотже глюк!!!!!
Все волосы на голове выдрал :(

Может кто глянет, а?
Исходник DLL:

library JornDLL;

uses
ShareMem,
SysUtils,
Classes,
Dialogs,
Forms;

{$R *.res}

Function LoadJorn(AHandle, FHandle: THandle):Longint; StdCall;
begin
Application.Handle:=AHandle;
ShowMessage("Start");
Result:=0;
End;

Procedure UnLoadJorn(ARef: LongInt); StdCall;
begin
ShowMessage("Stop");
End;

Exports
LoadJorn,
UnLoadJorn;

begin
end.


 
REA   (2002-09-17 12:04) [7]

ShareMem в основном проекте точно первым юнитом идет? Вроде ничего криминального нет тут. На всякий случай убери ShowMessage и используй OutputDebugString и проверь что в проекте тоже StdCall объявлено.


 
Ученик ©   (2002-09-17 12:18) [8]

>Dynamit (17.09.02 10:26)
Если не вызывать LoadJorn, ошибка есть ?


 
Andre V.   (2002-09-17 12:24) [9]

А тебя переопределение указателя на приложение не смущает.
Оно же потом не восстанавливается...
А использует программа его достаточно широко.


 
REA   (2002-09-17 12:36) [10]

У меня такое работает с переопределением Handle без восстановления. Только я еще RTL packages включаю - без них вместе с Sharemem глючит.


 
Dynamit   (2002-09-17 13:55) [11]

Попробовал восстановление Handle - не помогло :(

Насчет ShowMessage - без него тоже глючит!

Во глюк-то! Без LoadJorn и UnLoadJorn - все равно глючит, а ведь всего навсего загрузка-выгрузка DLL!!!!

Я ж прям с учебника списывал :)

?????


 
Ketmar ©   (2002-09-17 14:06) [12]

>Только я еще RTL packages включаю - без них вместе с Sharemem глючит.
и будет. потому что при построении "с пакетами" умные дельфи создают ОДИН экземпляр Application, а "без пакетов" глупые дельфи радостно плодят по экземпляру на каждую DLL, где есть "uses Forms". видимо, от этой путаницы у вас и глюки.

Satanas Nobiscum! 17-Sep-XXXVII A.S.


 
Dynamit   (2002-09-17 15:07) [13]

Нет, глюки в чем-то другом, так как я не собираюсь компоновать каждую DLL-ку выжимкой VCL, да и само приложение построено "с пакетами", а в дистрибутиве навалены BPL.

Может есть еще идеи?


 
REA   (2002-09-17 15:31) [14]

Ketmar
Лучше бы умные Delphi научились объединять RTTI DLL и приложения, а то в форму приложения даже Control не вставить, который в DLL создан.


 
Ketmar ©   (2002-09-17 15:46) [15]

будете смеяться, но как я не игрался, ни одной ошибки у меня не выскочило. по-всякому развлекался - ну нету ошибок, и все тут. к чему бы это?

Satanas Nobiscum! 17-Sep-XXXVII A.S.


 
REA   (2002-09-17 16:04) [16]

В таком проекте их и не должно быть, а вот если несколько thread запустить или MDIChild окон из DLL навешать в MDIParent приложения, тогда мелочи и всплывут, хотя и они побеждаются.


 
AlexT1000   (2002-09-17 16:18) [17]


@LoadJorn:=GetProcAddress(LibHandle,"LoadJorn");
нафига здесь @?!

оно тут не нужно!

LoadJorn:=GetProcAddress(LibHandle,"LoadJorn");

во как!



 
Dynamit   (2002-09-17 16:23) [18]

Я даже в одну процедуру запихал загрузку и выгрузку!

Нет, наверно глюк не в исходниках (как не люблю я ругать среду разработки, но в данном случае придется).

> Ketmar

Может мне Делфю переставить ???


 
Dynamit   (2002-09-17 16:28) [19]


> AlexT1000

"Наличие символа (@) перед переменной процедурного типа данных не позволяет компилятору выдать ошибку несовпадения типов." - цитата из очень умной книжки.


 
AlexT1000   (2002-09-17 16:34) [20]

у ЁЁЁЁЁЁЁЁЁЁЁЁ!

так типа за совпадением типов следить надо . это штука такая.

а sharemem тебе точно нужен? а если убать то чо?
так вроде все правильно.

и еще мож просто перегрузиться ,а не дельфи переставлять.
ну не мож такого быть.


 
Andre V.   (2002-09-17 17:02) [21]

ShareMem как речут мудрые люди позволяет использовать динамические массивы.
Только должен признаться без ??? у меня работает лучше


 
Ketmar ©   (2002-09-17 17:31) [22]

ShareMem нужно, если вы выполняете GetMem в главной программе и FreeMem в DLL-ках. (или наоборот %-). также нужно если вы передаете в/из DLL AnsiStrings. если такового не происходит - можно смело чистить uses от лишнего модуля. %-)

Satanas Nobiscum! 17-Sep-XXXVII A.S.


 
AlexT1000   (2002-09-17 18:08) [23]

прально товарисчь говорит.
sharemem - убрать.

где там автор темы?
че молчит?


 
Dynamit   (2002-09-18 09:42) [24]

Да инет у меня до 17.00 - работа такая!

А вот вам новая фишка - прога не глючит с любой другой DLL!

УРААА!!!
Убрал ShareMem - все заработало (лишний раз мне доказательство того, что не надо полностью доверять умным книжкам и советам help-ов)!

Если у вас есть еще какие пожелания или советы - пишите, буду рад почитать.

Всем огромное спасибо - не дали помереть глупому ослику ;)


 
REA   (2002-09-18 10:39) [25]

Да у меня все отлично работает и так и так. С ShareMem конечно есть нюансы, зато можно классы передавать, хотя может это и кривой подход, зато быстрее делать. А какой прямой подход в Delphi - интерфейсы передавать?



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

Текущий архив: 2002.09.30;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.026 c
1-98091
REA
2002-09-19 17:08
2002.09.30
Недержание свойств


3-97950
Bishop
2002-09-07 14:36
2002.09.30
FibDataSet


3-97944
maxim2
2002-09-09 06:29
2002.09.30
Не могу понять где ошибка?


14-98297
Dimka Maslov
2002-09-04 16:32
2002.09.30
Delphi 7


14-98330
MJH
2002-09-05 05:10
2002.09.30
Кто здесь с Риги ?