![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Проблема при работе с DLL
0x01 © (2008-03-12 15:12:00)Собственно проблема заключается в том, что при работе программы с 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
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
procedure DllMessage; external 'test1.dll'; //вызывается функция
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject) ;
begin
try
DllMessage;
finally
//application.Terminate;
end;
// showmessage('test1.dll');
end;
procedure TForm1.Button2Click(Sender: TObject);// распологает BMP // на форме
const
resGIF = 'progress';
var
h : THandle;
gif : TImage;
r:TRect;
begin
h := LoadLibrary('dll1.dll');
try
if h <> 0 then
begin
gif := Image1;//.Create(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 (2008-03-13 16:00:00) [1]
> 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;
MetalFan (2008-03-13 12:34:00) [2]
> при нажатии на кнопку создается TImage
а зачем динамически создавать TImage? просто на форму положить его нельзя?
Германн (2008-03-13 01:09:00) [3]
> 0x01 (12.03.08 19:38) [16]
>
> Кто нибудь может написать пример кода, где при нажатии на
> кнопку создается TImage-> получается BMP/JPG из DLL ->
> устанавливается полученное изображение на форму?
>
"Кто-нибудь" может, но лень. И ты сможешь, возможно, если по примеру MetalFan © глянешь в генофонд.
P.S. Насколько понял, DLL тут вообще ни при чем.
0x01 (2008-03-12 19:38:00) [4]Кто нибудь может написать пример кода, где при нажатии на кнопку создается TImage-> получается BMP/JPG из DLL -> устанавливается полученное изображение на форму?
MetalFan (2008-03-12 19:07:00) [5]нет, на сколько я понял TImage знать не узнает, что ты его Picture грохнул
MetalFan (2008-03-12 19:04:00) [6]ну ты взял у Image1 объектное св-во убил...
хотя надо глянуть vcl, может оно там обрабатывается верно...
0x01 (2008-03-12 17:49:00) [7]
> Германн © (12.03.08 17:25) [11]
Спасибо!
А в данной ситуации что нужно подправить в коде?
> MetalFan © (12.03.08 17:27) [12]
Почему?
MetalFan (2008-03-12 17:27:00) [8]
> gif := Image1;//.Create(Image1);
>...
> gif.Picture.Free;
> ...
хм. как-то нехорошо получается.
Германн (2008-03-12 17:25:00) [9]
> 0x01 (12.03.08 17:08) [10]
Читать в справке про calling convention
0x01 (2008-03-12 17:08:00) [10]Из кода видно, что первая DLL ('test1.dll') загружается при старте программы- статически, а вторая по требованию- т.е при нажатии кнопки- динамически. Какие соглашения о вызовах могут быть не соблюдены? Соглашения о вызовах - как я понял это декларация (объявление) способа загрузки DLL. Это так?
Reindeer Moss Eater (2008-03-12 17:01:00) [11]Мужик, соглашения о вызовах соблюдены у тебя или нет?
0x01 (2008-03-12 16:59:00) [12]Эта ошибка возникает при закрытии программы. А работа с DLL протекает без ошибок
Reindeer Moss Eater (2008-03-12 16:59:00) [13]соглашения о вызовах соблюдены?
0x01 (2008-03-12 16:57:00) [14]First chance exception at $7C812A7B. Exception class EInvalidPointer with message 'Invalid pointer operation'. Process test.exe (5608)
Reindeer Moss Eater (2008-03-12 16:52:00) [15]Будет намного лучше, если не философствовать многозначительно, а банально проверять результат, возвращаемый функциями и смотреть значение гетластеррор.
0x01 (2008-03-12 16:45:00) [16]Возможно будет проще создать процедуру которая располагает заданное изображение или иконку на форме. Как при таком алгоритме будут загружаться и выгружаться DLL? Рационален ли такой подход и можно ли так избежать ошибок?
Reindeer Moss Eater (2008-03-12 15:52:00) [17]У него лоад для другой длл делается
Eraser (2008-03-12 15:48:00) [18]
> 0x01 (12.03.08 15:12)
> procedure DllMessage; external 'test1.dll';
говорит о том, что DLL будет загружаться в память при запуске приложения, так что убери Load/FreeLibrary.
Reindeer Moss Eater (2008-03-12 15:47:00) [19]например может быть нарушено соглашение о вызовах и как следствие испорченный стек и ошибка.