在调用DLL中,类中定义的变量在一个方法里初始化后,在另一个方法里不能运用,变量的值消失。(100分)

  • 主题发起人 主题发起人 arychen
  • 开始时间 开始时间
A

arychen

Unregistered / Unconfirmed
GUEST, unregistred user!
type
TForm1 = class(TForm)
Panel1: TPanel;
Button1: TButton;
Button2: TButton;
OpenDialog1: TOpenDialog;
Button3: TButton;
procedure Button2Click(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
private
{ Private declarations }
hDibopen:HDIB;
hSrcFile:HFILE;
hPal:HPALETTE;
lpDib:PChar;

SrcRect:TRect;
DstRect:TRect;
public
{ Public declarations }
end;

在这个类里,在执行方法:



procedure TForm1.Button1Click(Sender: TObject);
var
OFS: OFSTRUCT;
begin
//打开图象文件
OpenDialog1.Execute;
if OpenDialog1.FileName <> '' then
begin
FillChar(OFS,Sizeof(OFS),0)
//填充OFSTRUCT结构
OFS.cBytes := Sizeof(OFS);
hSrcFile := OpenFile(PChar(OpenDialog1.FileName),OFS,OF_READ);
hDibopen := ReadDIBFile(hSrcFile);
lpDib := PChar(GlobalLock(HGLOBAL(hDibopen)));

//检测图象大小
if ((DibWidth(lpDib)>INT_MAX) or (DIBHeight(lpDib)>INT_MAX)) then
begin
ShowMessage('BMP图象太大!');
end;

//创建调色板,如没有指定调色板,hPal为空,则使用系统默认调色板
CreateDIBPalette(hDibopen,hPal);
if (hPal = 0 ) then
begin
hPal := 0;
end;

//指定图象源和绘画目标设备的RECT
SrcRect.Left:=0;
SrcRect.Top:=0;
SrcRect.Right:=DibWidth(lpDib);
SrcRect.Bottom:=DibHeight(lpDib);
DstRect := SrcRect;

//在指定设备上绘图
PaintDib(GetDC(Panel1.Handle),SrcRect,hDibOpen,DstRect,hPal);
end;
end;

其中调用的函数在一个DLL中定义,而且调用正常。
但是在另一个方法里,在用到类中的一些变量如已定义的lpDib:PChar;时一直有异常出现。
为什么在不同的方法里不能用? 是哪里出的问题导致变量在第一个函数执行后不能用?
在第二个函数里只要从头开始打开文件等操作都执行,那得到的lpDib都是可用的,正常的。为什么用第一个方法里已经定义得到数值的变量不行??
 
你要把两个都贴出来呀
 
就是在别的方法里调用都不能用。
 
晕,要看你怎么调的呀,是同一个TForm1里吗?
 
在同一个FORM的别的方法里调用就报内存错误!!!
 
先调别的方法呢?
怀疑你dll过程中写内存溢出了,破坏掉了self指针
 
找到原因了
VC里是按照C的调用方式导出函数的。不过在DELPHI里是用STDCALL修饰了,那样按照PASCAL顺序传参数了。不过奇怪怎么在一个函数里没问题??
我把STDCA改成CDCEL后就好了。
 
后退
顶部