-
Собственно проблема заключается в том, что при работе программы с DLL возникает ошибка при закрытии программы(Invalid pointer operation). В программе выполняются 2 процедуры: 1. Вызывается функция из DLL 2. Помещается на форму изображение которое расположенно в DLL Выкладываю код:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes,
Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
Image1: TImage;
procedure Button1Click(Sender: TObject) ;
procedure Button2Click(Sender: TObject);
private
public
end;
var
Form1: TForm1;
procedure DllMessage; external 'test1.dll';
implementation
procedure TForm1.Button1Click(Sender: TObject) ;
begin
try
DllMessage;
finally
end;
end;
procedure TForm1.Button2Click(Sender: TObject); const
resGIF = 'progress';
var
h : THandle;
gif : TImage;
r:TRect;
begin
h := LoadLibrary('dll1.dll');
try
if h <> 0 then
begin
gif := Image1; try
gif.Picture.Bitmap.LoadFromResourceName(h,resGIF);
ShowMessage('Load Resource DLL !');
finally
gif.Picture.Free;
end;
end
else
begin
ShowMessage('Load Resource DLL FAILED!');
end;
finally
FreeLibrary(h);
end;
end;
end.
Где допущена ошибка? Заранее спасибо!
-
например может быть нарушено соглашение о вызовах и как следствие испорченный стек и ошибка.
-
> 0x01 (12.03.08 15:12)
> procedure DllMessage; external 'test1.dll';
говорит о том, что DLL будет загружаться в память при запуске приложения, так что убери Load/FreeLibrary.
-
У него лоад для другой длл делается
-
Возможно будет проще создать процедуру которая располагает заданное изображение или иконку на форме. Как при таком алгоритме будут загружаться и выгружаться DLL? Рационален ли такой подход и можно ли так избежать ошибок?
-
Будет намного лучше, если не философствовать многозначительно, а банально проверять результат, возвращаемый функциями и смотреть значение гетластеррор.
-
First chance exception at $7C812A7B. Exception class EInvalidPointer with message 'Invalid pointer operation'. Process test.exe (5608)
-
соглашения о вызовах соблюдены?
-
Эта ошибка возникает при закрытии программы. А работа с DLL протекает без ошибок
-
Мужик, соглашения о вызовах соблюдены у тебя или нет?
-
Из кода видно, что первая DLL ('test1.dll') загружается при старте программы- статически, а вторая по требованию- т.е при нажатии кнопки- динамически. Какие соглашения о вызовах могут быть не соблюдены? Соглашения о вызовах - как я понял это декларация (объявление) способа загрузки DLL. Это так?
-
> 0x01 (12.03.08 17:08) [10]
Читать в справке про calling convention
-
> gif := Image1;//.Create(Image1); >... > gif.Picture.Free; > ...
хм. как-то нехорошо получается.
-
> Германн © (12.03.08 17:25) [11]
Спасибо!
А в данной ситуации что нужно подправить в коде?
> MetalFan © (12.03.08 17:27) [12]
Почему?
-
ну ты взял у Image1 объектное св-во убил... хотя надо глянуть vcl, может оно там обрабатывается верно...
-
нет, на сколько я понял TImage знать не узнает, что ты его Picture грохнул
-
Кто нибудь может написать пример кода, где при нажатии на кнопку создается TImage-> получается BMP/JPG из DLL -> устанавливается полученное изображение на форму?
-
> 0x01 (12.03.08 19:38) [16] > > Кто нибудь может написать пример кода, где при нажатии на > кнопку создается TImage-> получается BMP/JPG из DLL -> > устанавливается полученное изображение на форму? >
"Кто-нибудь" может, но лень. И ты сможешь, возможно, если по примеру MetalFan © глянешь в генофонд.
P.S. Насколько понял, DLL тут вообще ни при чем.
-
> при нажатии на кнопку создается TImage
а зачем динамически создавать TImage? просто на форму положить его нельзя?
-
> MetalFan © (13.03.08 12:34) [18]
Хорошая идея. Тогда получается надо при загрузке приложения статически загрузить нужную DLL и расположить на форме нужную картинку. Правильно понял? Только на форму надо ложить изображение которое расположено в DLL, а не в одной папке с EXE приложением. > Германн © (13.03.08 01:09) [17]
> P.S. Насколько понял, DLL тут вообще ни при чем.
А в чем же? По предыдущим постам понял что проблема в соглашених о вызовах. Разве обязательно при статической загрузки DLL -> 1. объявлять ее в uses 2. И создавать что-то наподобие
TResource = class
class function GetIcon(const DLLName : string; const IconResName : string): HIcon;
class function GetGIF(const DLLName : string; const GifResName : string): TGifImage;
|