Форум: "Основная";
Текущий архив: 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