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

Вниз

Ошибка выгрузки 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.009 c
1-98065
grifon
2002-09-19 12:56
2002.09.30
TStrings - Abstract Error


8-98240
RealDummy
2002-05-30 02:27
2002.09.30
Как среди множества точек найти похожую на образ фигуру?


14-98273
AL2002
2002-09-03 11:48
2002.09.30
Может, в рифмы поиграем?


1-98085
tytus
2002-09-19 17:31
2002.09.30
Две формы


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





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