求救 在DLL中包含ADO组件

applezhao 2005-11-07 05:34:24
我在调用包含ADOQuery组件的DLL后,程序关闭时总会跳出一个内存错误,去掉ADO调用就一切正常,那位大侠做过类似问题的能不能给个提示,万分感激!
已经试过各种方法,就差把ADOQuery从DLL在中去掉了!晕阿!
...全文
101 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
nadel 2005-11-07
  • 打赏
  • 举报
回复
sharemem是宝兰的内存管理单元,因为你传的参数中含有string类型,它是Delphi中内存分配比较特殊的类型,所以在单元引用的时候必须加上sharemem单元,而且要放在第一的位置。你看一下动态库接口声明单元上的那一段英文就知道了,上面说得很清楚。
applezhao 2005-11-07
  • 打赏
  • 举报
回复
呵呵,我试过了,可以用,就是不知道什么原理,能说一下吗!太感谢了!
aiirii 2005-11-07
  • 打赏
  • 举报
回复
在 主程序 和 dll 都 uses sharemem;
而且要在第一个位置
applezhao 2005-11-07
  • 打赏
  • 举报
回复
代码贴上来就很乱了,要不你给我一个你的代码好妈,把代码文件给我拜读一下!
不胜感激!
applezhao 2005-11-07
  • 打赏
  • 举报
回复
//DLL中执行函数
procedure TStencil_LandForm.Land_ButtonClick(Sender: TObject);
var
pwd: string[32];
begin
if Trim( NameEdit.Text ) = '' then
begin
MessageDlg('ÇëÊäÈëÓû§Ãû£¡',mtError,[mbOK],0);
NameEdit.SetFocus;
Exit;
end;

if Trim( PwdEdit.Text ) = '' then
begin
MessageDlg('ÇëÊäÈëÃÜÂ룡',mtError,[mbOK],0);
Exit;
end;

pwd := md5s( PwdEdit.Text );

ADOQuery1 := TADOQuery.Create(self);

ADOQuery1.ConnectionString := ADOCStr;

ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add( 'select ' + IFN + ',' + UFN + ',' + PFN + ' From ' +
TableName + ' Where ' + UFN + '=' +
chr(39) + trim(NameEdit.Text) + chr(39) + ' and '
+ Term);
ADOQuery1.Open;

if ADOQuery1.IsEmpty then
begin
MessageDlg('ÎÞ´ËÓû§Ãû£¬Çë¼ì²éÊäÈ룡',mtError,[mbOK],0);
Exit;
end
else
begin
ADOQuery1.First;

repeat
if pwd = ADOQuery1.FieldByName( PFN ).AsString then
begin
IntPoint^ := 1;
Break;
end;
ADOQuery1.Next;
until ADOQuery1.Eof;

ADOQuery1.Close;

if IntPoint^ = 1 then
close
else
MessageDlg('ÃÜÂë´íÎó',mtError,[mbOK],0);
end;
end;
applezhao 2005-11-07
  • 打赏
  • 举报
回复
//窗口创建函数
Function LandFormCreate(Ha:THandle;ADOStr: String;TabName:string;IndexFN:string;
UserFN:string;PassFN:string;Ter: string;IntP: TIntP):
Boolean;
var
LandForm: TStencil_LandForm;
begin
Application.Handle := Ha;
Application.Tag := 0;
Try
Application.Initialize;
LandForm:=TStencil_LandForm.Create(Application);
Land.AdoCStr := ADOStr;
Land.IFN := IndexFN;
Land.UFN := UserFN;
Land.PFN := PassFN;
Land.TableName := TabName;
Land.Term := Ter;
IntPoint := IntP;
LandForm.ShowModal;
result := true;
Except
MessageDlg('´´½¨´°¿Úʧ°Ü£¡',mtError,[mbOK],0);
result := false;
End;
end;

//调用过程
type
TIntP=^Integer;
TLandFun=Function (Ha:THandle;ADOStr: String;TabName:string;IndexFN:string;
UserFN:string;PassFN:string;Ter: string;IntP: TIntP):
Boolean;Stdcall;
var
Handle: THandle;
FunPro: TFarProc;
i:integer;
IntPoint: TIntP;
begin
FunPro := nil;
i := 0;
IntPoint := @i;
Handle := LoadLibrary(DLLPath + 'ProLand.dll');

if Handle > 32 then
try
Try
FunPro := GetProcAddress( Handle,PChar('LandFormCreate') );
except
MessageDlg('ÔØÈëDLLº¯Êý´íÎó£¡',mtError,[mbOK],0);
end;

try
TLandFun(FunPro)( Finance_MainForm.Handle,
DataModule1.ADOQuery1.ConnectionString,'[1860_Op]',
'O_id','O_UName','O_PassWord','O_Type='+
chr(39) + 'Bursar' + chr(39),IntPoint );
except
showmessage('1µ÷Óóö´í£¡');
end;
Except
ShowMessage('2µ÷Óóö´í£¡');
end;
end;
Lwg0901 2005-11-07
  • 打赏
  • 举报
回复
做个几个类似的dll和com都没楼主所说的问题

把代码贴出来看看

2,498

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 数据库相关
社区管理员
  • 数据库相关社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧