(急)DLL封装ADO操作的超级问题!

javavip 2008-07-20 09:58:36
用DELPHI开发与ADO相关的DLL,编译DLL成功,但在主程序调用的时候却报错。反复排查,还没能解决错误里的非法指针的问题,因为非常急需,特请各位多多指点,谢谢!

报错如下:
--------------------------------------
Project Project1.exe raised exception class EInvalidPointer with message 'Invalid pointer operation'.



代码如下:
--------------------------------------
library mydb;
uses
base in 'base.pas';

{$R *.res}

exports OpenConn,getConn,CloseConn;

begin
LibIni;
ExitProc := @LibExit;
end.



unit base;
interface
uses
SysUtils, Classes, ActiveX, ADODB;

procedure LibIni;
procedure LibExit;
procedure OpenConn();stdcall;
function getConn():TADOConnection;stdcall;
procedure CloseConn();stdcall;

var
SaveExit:Pointer;
ADOConn: TADOConnection;
ConnectionString: String;
CommandTimeout: Integer;

implementation

procedure LibIni;
begin
CoInitialize(nil);
ConnectionString := getStr('ConnectionString');
CommandTimeout := getInt('CommandTimeout');
SaveExit := ExitProc;
end;

procedure LibExit;
begin
CoUninitialize;
ExitProc := SaveExit;
end;

procedure OpenConn();stdcall;
begin
try
ADOConn := TADOConnection.Create(nil);
ADOConn.ConnectionString := ConnectionString;
ADOConn.CommandTimeout := CommandTimeout;
ADOConn.Connected := True;
ADOConn.Open;
except on E: Exception do
begin
ADOConn.Close;
ADOConn.Free;
end;
end;
end;

function getConn():TADOConnection;stdcall;
begin
Result := ADOConn;
end;

procedure CloseConn();stdcall;
begin
try
ADOConn.Connected := False;
ADOConn.Close;
ADOConn.Free;
ADOConn := nil;
except on E: Exception do
//
end;
end;

end.
...全文
246 37 打赏 收藏 转发到动态 举报
写回复
用AI写文章
37 条回复
切换为时间正序
请发表友善的回复…
发表回复
javavip 2008-07-24
  • 打赏
  • 举报
回复
非常感谢Avan_Lau、fenger8293 ,把ShareMem放在两个地方的最前面就OK了。
估计我的系统不用重新安装了,哈哈,谢谢!
金卯刀 2008-07-24
  • 打赏
  • 举报
回复
建議你看一下dll工程文件中,最前面的那段英文註釋
javavip 2008-07-24
  • 打赏
  • 举报
回复
TO:Avan_Lau
是呀,fenger8293 也是这么纠正的。


真的谢谢各位了!
金卯刀 2008-07-24
  • 打赏
  • 举报
回复
剛才看了你給我發代碼,發現你sharemem加錯地方,不是加在單元uses的最前面,而是工程文件(*.prj)uses段的第一段,修改后,運行沒錯誤。源代碼修改后,我會再發給你, 你自己在測試一下。
javavip 2008-07-24
  • 打赏
  • 举报
回复
你编译的在我家里的电脑上运行没问题,在代码完全一样的情况下在我电脑上再次编译就又出错了;
但是同样的代码在我家另外一台电脑上再次编译,又是正常无误的。

我在怀疑是不是电脑系统有问题?
手指风 2008-07-24
  • 打赏
  • 举报
回复
不会的吧,我这里都正常了.不可能我编出来的ok,你那边就有问题吧
javavip 2008-07-23
  • 打赏
  • 举报
回复
TO:seekmydoom
这个问题就留做课题吧。
我打算把数据库处理的操作放在需要的DLL里,先把项目做完了。
javavip 2008-07-23
  • 打赏
  • 举报
回复
TO:fenger8293
为了尽快解决这个问题,我在公司安装了DELPHI7来实时测试。
刚刚在libini里传了固定的值测试,还是一样,运行就没问题,只是在退出的时候还是出现相同错误。
javavip 2008-07-23
  • 打赏
  • 举报
回复
TO:Avan_Lau ,又发了一次,附件TEST.RAR。


目前首要问题先推进项目进度,不过这个问题留着着实是个疙瘩。

我喜欢完美:)
手指风 2008-07-23
  • 打赏
  • 举报
回复
我copy你的程序,只是在libini里传了固定的值.运行没发现任何问题。
对于'Invalid pointer operation'错误应该是堆和栈内存指针混指的错误.
你可以仔细检查下自己的其他代码.看看getStr和getint有没有问题.
seekmydoom 2008-07-23
  • 打赏
  • 举报
回复
如果仅作为解决问题,采用4楼的方法即可,我也曾经碰到这个问题,只传入字符串就可以
金卯刀 2008-07-23
  • 打赏
  • 举报
回复
你忘記貼附件了吧,咋沒看到source?不會說是源碼太大被擋住了?
javavip 2008-07-23
  • 打赏
  • 举报
回复
好奇怪!
我用你发给我的TEST文件重新编译,就又出现相同错误了。

是我的DELPHI7有问题,还是我的系统有问题?
javavip 2008-07-23
  • 打赏
  • 举报
回复
非常感谢啊,在公司里测试无错误了,回家再测试下!
javavip 2008-07-23
  • 打赏
  • 举报
回复
已发邮件,请收,辛苦了!
手指风 2008-07-23
  • 打赏
  • 举报
回复
你把代码发到9870525@qq.com.去掉第三方组件.
手指风 2008-07-22
  • 打赏
  • 举报
回复
我把你的代码copy过来好象没出错.要么你在procedure LibExit; 后面加far;试试
手指风 2008-07-22
  • 打赏
  • 举报
回复
因为ADO用到了COM,所以要CoInitialize; CoUninitialize是肯定的.
不过建议你修改下程序,去掉LibExit函数,而采用在unit base的end.前加
initialization
CoInitialize;
Finalization
CoUninitialize;
来进行初始化和反初始化.
'Invalid pointer operation'错误好象是地址类型不匹配会出现的错误,在将一个堆内存地址指向栈内存地址时引起的错误就是'Invalid pointer operation'.
估计是你的ExitProc造成的.
javavip 2008-07-22
  • 打赏
  • 举报
回复
真是太感谢了!晚上回去我发给你,实在麻烦了,谢谢!
金卯刀 2008-07-22
  • 打赏
  • 举报
回复
這樣不是辦法,可否把你的code 發給我?我幫你看看 byl134@163.com
加载更多回复(17)

2,497

社区成员

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

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