生成DLL库对数据库大对象字段处理时,遇到的问题。(100分)

  • 主题发起人 hanyongjian
  • 开始时间
H

hanyongjian

Unregistered / Unconfirmed
GUEST, unregistred user!
我写了一个单元文件ImageEditDlg,其中有一全局过程为
procedure EditDBImage(ASource: TDataSource; AField: ShortString);

起先,我将ImageEditDlg单元文件添加到应用程序中去运行,可以使用EditDBImage
过程弹出一窗口对ASource数据源的AField图像字段进行编辑。现在的问题是,由于对
图像编辑的功能使用得比较少。所以我将ImageEditDlg单元单独放到一个DLL库中去由
应用程序动态调用。但运行时仅弹出一个窗口,而看到不图像。窗口的基本功能不变,
就是不能够从数据集读取图像或将图像保存到数据集中去。

谁能够提示一下错误的原因。

部分程序代码如下:
应用程序:
ImageEditDlg.EditDBImage(ASource, AField);
//以上过程弹出一个窗口,可以对ASource中的AField图像字段进行编辑。


//后将原过程更改为使用DLL库。
TEditDBImageProc = procedure(AHandle: THandle; ASource: TDataSource; AField: ShortString); StdCall;
EDLLLoadError = class(Exception);
procedure EditDBImage(ASource: TDataSource; AField: ShortString); //编辑图形字段

implementation

//-----------------------------------------------------------------------------
procedure EditDBImage(ASource: TDataSource; AField: ShortString); //编辑图形字段
var
LibHandle: THandle;
EditProc: TEditDBImageProc;
begin
LibHandle := LoadLibrary('EditDBImage.DLL');
try
if LibHandle = HINSTANCE_ERROR then
raise EDLLLoadError.Create('找不到EditDBImage.DLL文件!');
@EditProc := GetProcAddress(LibHandle, 'EditImage');
if (@EditProc = nil) then
raise Exception.Create('GetProcAddress调用失败,错误代码是:' + IntToStr(GetLastError))
else
EditProc(Application.Handle, ASource, AField);
finally
FreeLibrary(LibHandle);
end;
end;
//以上过程仅弹出一个窗口,但却见不到图像,新添加的图像也保存不到数据集中去。


ImageEditDlg单元文件中的一些定义:
procedure EditImage(AHandle: THandle; ASource: TDataSource; AField: ShortString);StdCall;
procedure EditDBImage(ASource: TDataSource; AField: ShortString);

exports EditImage;

implementation

//-----------------------------------------------------------------------------
procedure EditImage(AHandle: THandle; ASource: TDataSource; AField: ShortString);StdCall;
begin
Application.Handle := AHandle;
EditDBImage(ASource, AField);
end;


//-----------------------------------------------------------------------------
procedure EditDBImage(ASource: TDataSource; AField: ShortString);
//编辑ASource中的AField图片字段。
var
DlgImage: TDlgImageEdit;
begin
DlgImage := TDlgImageEdit.Create(Application);

with DlgImage do
try
dbeImage.DataSource := ASource;
dbeImage.DataField := AField;
ShowModal;
finally
Free;
end;
end;
 
没有人懂吗?
 
好好研究一下DLL!
 
应当把数据库指针和LOB对象的引用也传入到DLL中。不然你调用DLL后,和数据库根本没有连接
怎么修改和获取呀?
 
补充说一句,我认为仅传数据源及字段名称即可。因为我可以将字段中的图片保存到
临时文件中,再读取到图像编辑控件(ImageEn)中。当编辑完之后,又可以通过临时文
件保存回数据集中。只不过我现在不想使用临时文件,而直接使用数据字段来完成。
 
多人接受答案了。
 
顶部