关于动态链接的奇怪现象````高手帮忙看看``分不够再加加加 ( 积分: 50 )

  • 主题发起人 主题发起人 xiang8410
  • 开始时间 开始时间
X

xiang8410

Unregistered / Unconfirmed
GUEST, unregistred user!
小弟做了一个DLL文件,然后另建一个应用程序进行调用,但在调用完DLL文件后关闭窗体会报错``````````````错误提示如下:Exception&nbsp;EAccessViolation&nbsp;in&nbsp;module&nbsp;Project1.exe&nbsp;at&nbsp;010454F4.Access&nbsp;Violation&nbsp;at&nbsp;address&nbsp;010464F4.这个错误之后还会出现以下错误提示&nbsp;Access&nbsp;violation&nbsp;at&nbsp;address&nbsp;010464F4.Read&nbsp;of&nbsp;address&nbsp;010464F4<br>调用DLL的程序如下:<br>unit&nbsp;Unit1;<br><br>interface<br><br>uses<br>&nbsp;&nbsp;Windows,&nbsp;Messages,&nbsp;SysUtils,&nbsp;Variants,&nbsp;Classes,&nbsp;Graphics,&nbsp;Controls,&nbsp;Forms,<br>&nbsp;&nbsp;Dialogs,&nbsp;StdCtrls,&nbsp;ExtCtrls;<br><br>type<br>&nbsp;&nbsp;TDLLFrom=function(aHandle:Tform;username,password,dbname,serverip:string):TForm;stdcall;<br>&nbsp;&nbsp;TForm1&nbsp;=&nbsp;class(TForm)<br>&nbsp;&nbsp;&nbsp;&nbsp;Edit1:&nbsp;TEdit;<br>&nbsp;&nbsp;&nbsp;&nbsp;Edit2:&nbsp;TEdit;<br>&nbsp;&nbsp;&nbsp;&nbsp;Edit3:&nbsp;TEdit;<br>&nbsp;&nbsp;&nbsp;&nbsp;Edit4:&nbsp;TEdit;<br>&nbsp;&nbsp;&nbsp;&nbsp;Button1:&nbsp;TButton;<br>&nbsp;&nbsp;&nbsp;&nbsp;Panel1:&nbsp;TPanel;<br>&nbsp;&nbsp;&nbsp;&nbsp;procedure&nbsp;FormCreate(Sender:&nbsp;TObject);<br>&nbsp;&nbsp;&nbsp;&nbsp;procedure&nbsp;FormDestroy(Sender:&nbsp;TObject);<br>&nbsp;&nbsp;&nbsp;&nbsp;procedure&nbsp;Button1Click(Sender:&nbsp;TObject);<br>&nbsp;&nbsp;private<br>&nbsp;&nbsp;public<br>&nbsp;&nbsp;&nbsp;&nbsp;dllhandle:THandle;<br>&nbsp;&nbsp;end;<br>var<br>&nbsp;&nbsp;Form1:&nbsp;TForm1;<br>implementation<br>{$R&nbsp;*.dfm}<br>procedure&nbsp;TForm1.FormCreate(Sender:&nbsp;TObject);<br>begin<br>&nbsp;&nbsp;dllhandle:=LoadLibrary('E:/MJ/PMJDLL.dll');<br>&nbsp;&nbsp;if&nbsp;dllhandle=0&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;raise&nbsp;Exception.Create('不能加载PMJDLL.dll');<br>end;<br>procedure&nbsp;TForm1.FormDestroy(Sender:&nbsp;TObject);<br>begin<br>&nbsp;&nbsp;&nbsp;FreeLibrary(dllhandle);<br>end;<br>procedure&nbsp;TForm1.Button1Click(Sender:&nbsp;TObject);<br>var<br>&nbsp;&nbsp;ShowMJ:TDLLFrom;<br>&nbsp;&nbsp;dllform:Tform;<br>&nbsp;&nbsp;username,password,dbname,serverip:string;<br>begin<br>&nbsp;&nbsp;username:=trim(edit1.Text);<br>&nbsp;&nbsp;password:=trim(edit2.Text);<br>&nbsp;&nbsp;dbname:=trim(edit3.Text);<br>&nbsp;&nbsp;serverip:=trim(edit4.Text);<br>&nbsp;&nbsp;@ShowMJ:=GetProcAddress(dllhandle,'ShowMJ');<br>&nbsp;&nbsp;if&nbsp;(@ShowMJ=nil)&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RaiseLastWin32Error;<br>&nbsp;&nbsp;dllform:=showMJ(form1,username,password,dbname,serverip);<br>&nbsp;&nbsp;dllform.ParentWindow:=panel1.Handle;<br>&nbsp;&nbsp;dllform.Show;<br>end;<br>end.<br>dll程序大概如下:<br>public<br>&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;Public&nbsp;declarations&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;connectionserver(username,password,dbname,serverip:string):Boolean;&nbsp;//连接数据库<br>&nbsp;&nbsp;end;<br>&nbsp;&nbsp;function&nbsp;ShowMJ(MJform:TForm;username,password,dbname,serverip:String):Tform;stdcall;<br>var<br>&nbsp;&nbsp;MJFrm:&nbsp;TMJFrm;<br><br>implementation<br>&nbsp;&nbsp;uses&nbsp;ActiveX;<br>{$R&nbsp;*.dfm}<br>function&nbsp;ShowMJ(MJform:TForm;username,password,dbname,serverip:String):Tform;<br>begin<br>&nbsp;&nbsp;&nbsp;&nbsp;try<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CoInitialize(nil);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MJFrm:=TMJFrm.Create(MJform);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;MJFrm.connectionserver(username,password,dbname,serverip)=true&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MJFrm.Left:=10;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MJFrm.Top:=10;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Result:=MJFrm;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ShowMessage('注意!参数不正确');<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exit;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end;<br>&nbsp;&nbsp;&nbsp;&nbsp;finally<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CoUninitialize();<br>&nbsp;&nbsp;&nbsp;&nbsp;end;<br>end;<br>function&nbsp;TMJFrm.connectionserver(username,&nbsp;password,&nbsp;dbname,<br>&nbsp;&nbsp;serverip:&nbsp;string):&nbsp;Boolean;<br>var<br>&nbsp;&nbsp;&nbsp;connstr:string;<br>begin<br>&nbsp;&nbsp;&nbsp;Result:=False;<br>&nbsp;&nbsp;&nbsp;connstr:='provider=SQLOLEDB.1;Persist&nbsp;Sercurity&nbsp;Info=false;User&nbsp;ID='<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+quotedstr(username)+';Password='+quotedstr(password)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+';Initial&nbsp;Catalog='+quotedstr(dbname)+';Data&nbsp;Source='+quotedstr(serverip);<br>&nbsp;&nbsp;&nbsp;ADOConnection1.ConnectionString:=connstr;<br>&nbsp;&nbsp;&nbsp;ADOConnection1.ConnectionTimeout:=5;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ADOConnection1.Connected:=True;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Result:=True;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ADOQuery1.Connection:=ADOConnection1;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DataSource1.DataSet:=ADOQuery1;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;except<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MessageBox(self.Handle,'数据库连接失败,请重新连接','注意',mb_ok);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Application.Terminate;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end;<br>end;
 
老问题了,在dll和主程序的dpr文件的第一个位置引用&nbsp;sharemem单元。要么不要使用string类型,用pchar代替。<br>主程序打开dpr文件的方法,点击project菜单下的&nbsp;view&nbsp;source菜单
 
楼上的兄弟已经说到点上了。
 
to&nbsp;ufo!,<br>我试引用sharemem单元了```但还不行``也写了一个出口函数,在里面把创建的窗体给释放了,但都还不行,你能不能再解释清楚一点,你有这方面的简单例子吗,能发个给我我参考参考吗,我的邮箱xiang_8410@163.com````````````
 
你要在主程序和dll两边的dpr文件内都引用sharemem单元。
 
to&nbsp;ufo!<br>我有呀````在主程序和dll两边的dpr文件内都引用sharemem单元,但就还不行`````<br>我在DLL的函数里加了try..........finall&nbsp;MJFrm.free结果就是直接在调用时,弹出显示CPU````我是怀疑没有把那个窗体给释放掉`````````能给我指导一下怎么释放那个窗体吗或者是帮我修改一下上那个原代码~~~~~~~~~小弟真的是很急了```老是解决不了这个问题~~~拜托了~~~~~~~~
 
是不是显示的模式窗口,如果不是模式窗口,那么最好用消息通知主程序来释放。<br>这样看代码比较累,或者你打包发到我邮箱,我调试一下看看。<br>ufo2003@126.com
 
function&nbsp;ShowMJ(MJform:TForm;username,password,dbname,serverip:String):Tform;<br>begin<br>&nbsp;&nbsp;&nbsp;&nbsp;try<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CoInitialize(nil);&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;要这句干什么呢,直接拖的&nbsp;adoconnection&nbsp;,那ado&nbsp;就已经做好了,不用你弄了<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MJFrm:=TMJFrm.Create(MJform);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;MJFrm.connectionserver(username,password,dbname,serverip)=true&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MJFrm.Left:=10;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MJFrm.Top:=10;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Result:=MJFrm;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ShowMessage('注意!参数不正确');<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exit;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end;<br>&nbsp;&nbsp;&nbsp;&nbsp;finally<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CoUninitialize();&nbsp;&nbsp;//&nbsp;这个也是<br>&nbsp;&nbsp;&nbsp;&nbsp;end;<br>end;<br><br>去掉上面的试试
 
不行呀````&nbsp;CoInitialize(nil);&nbsp;&nbsp;&nbsp;&nbsp;这个去掉直接报错的`````&nbsp;这个是在DLL中要初始化ADO的,不能去掉`````
 
function&nbsp;ShowMJ(MJform:TForm;username,password,dbname,serverip:String):Tform;stdcall;中的string不能用,使用shortstring看看,如果还不行,把你的程序给我,我给你看看
 
程序已经替你调试好了,关闭程序不在报错。<br>由于修改了多个地方,一句两句说不清楚,你自己收取邮件吧。<br>不过,重点是这句&nbsp;CoUninitialize();&nbsp;&nbsp;<br>导致了资源的重复释放,我把它注释掉了。
 
来自:xiang8410,&nbsp;时间:2007-7-14&nbsp;12:00:37,&nbsp;ID:3810541<br>不行呀````&nbsp;CoInitialize(nil);&nbsp;&nbsp;&nbsp;&nbsp;这个去掉直接报错的`````&nbsp;这个是在DLL中要初始化ADO的,不能去掉`````&nbsp;<br><br><br>我的Dll&nbsp;不加这个运行的很好呀
 
谢谢楼上的几位高手们`````我的问题在UFO帮助下已经解决了``````给分了````谢谢了
 
后退
顶部