首 页 网络编程
网页制作 图形图象 操作系统 冲浪宝典
软件教学 认证考试

网络安全 网络办公 行业资讯 评测对比
您当前位置:站长天空 -> 操作系统-> 注册表教程
powerbuilder调用delphi写的dll时发生的奇怪问题_delphi教程
作者:网友供稿 点击:0
推荐
西部数码-全国虚拟主机10强!20余项虚拟主机管理功能,全国领先!第6代双线路虚拟主机,南北访问畅通无阻!可在线rar解压,自动数据恢复设置虚拟目录等.免费赠送访问统计,企业邮局.Cn域名注册10元/年,自助建站480元起,免费试用7天,满意再付款!P4主机租用799元/月.月付免压金
站内搜索
文章页数:[1] 
因项目需要,我用Delphi写了一个连接数据库把数据导出到Sql文件的dll,其中使用了TADOQuery组件。
其中只有一个导出方法:
function DataExport(path,ini_path:PChar):integer

  写完之后,用delphi写了一个test.exe进行测试,发现可以正常使用。
之后便把这个dll交给了同事,让他在PowerBuilder中调用。同事拿过去之后发现,一旦调用DataExportPB就报告无法打开目标Dll。我想可能是因为两边运行的环境不一样,随后就把test.exe拷过去试试看。奇怪的是,test.exe运行正常。

  为了确定问题到底出现在哪里,我又使用Python和C#测试了一下,C#下面没有问题,但是Python报告错误:
没有调用 CoInitialize()
查阅资料之后发现,如果在Delphi的Dll里面使用了ADO组件,那么需要在使用之前调用ActiveX的CoInitialize方法。知道了问题之后就好办多了,在源代码中创建TADOQuery之前调用CoInitialize(),Python调用成功。

  本以为PowerBuilder也应该没问题,可谁知还是一样的问题。这下子我想不通了。Python中的ctypes模块使用的C中的调用方法,参数传递方式应该和PowerBuilder一样,可是为什么PB里面还是不行呢?同事让我在Dll里面多写一个输出方法试试看,那好,我又写了下面这样一个方法:

function test:PChar;
begin
  result := Test string from test;
end;

  PB里面调用test方法成功,  接着同事又尝试调用DataExport,成功了!!??为什么?这个test方法仅仅只是输出一段固定的字符串而已,为什么DataExport就调用成功了呢?我真是百思不得其解。

  但是这时又出现一个问题,一旦退出PB应用程序则发生一个内存操作错误。

  我仔细检查了Delphi代码,以图发现是不是哪一个对象没有释放,我的代码如下:

function DataExport(path,ini_path:PChar):integer;
var
  query : TADOQuery;
begin
  .........
  CoInitialize();
  query := TADOQuery.Create(nil);
  .........
  query.Close;
  query.Free;
  CoUnInitialize();
  .........
end;

没有什么问题啊!无奈之下我把CoInitialize()和CoUnInitialize()分成两个独立方法。
function init:integer;
begin
  try
    CoInitialize();
    result := 1;
  except
    on Exception:
      result := 0;
  end;
end;

function uninit:integer;
begin
  try
    CoUnInitialize();
    result := 1;
  except
    on Exception:
      result := 0;
  end;
end;

然后让同事在窗体初始化事件中先调用 init,然后再关闭事件中调用 uninit。问题解决。什么都正常了。

虽然问题得到解决,但是我还是不明白为什么要这样做。



文章整理:站长天空 网址:http://www.z6688.com/
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

文章页数:[1] 


放大字体显示 缩小字体显示 打印文章 推荐给朋友
热门文章
·更改internet explorer的图标
·C#中的类型转换-.NET教程,C#语言
·找回flash的序列号sn
·更改ie的图标
·如何让你的VB6 IDE支持鼠标滚轮(过程)-.NET教程,VB.Net语言
·正则表达式Replace-.NET教程,Asp.Net开发
·Windows 2003下不注册组件用ASP发邮件-ASP教程,邮件相关
·防止ie被恶意修改的初级技巧
·asp.net实现分组全选部分复选框-ASP教程,ASP应用
·清理ie网址列表
最新文章
·seo新手教程:title的写法_seo网站优化
·从注册表下手 切断一切黑客入侵的路径_注册表教程
·用flash 8 as代码写摄像头拍照功能_flash教程
·小站长赚钱思路:ip不到1000,一个月赚940元_网赚技巧
·陈艺光:网络游戏平台与游戏网站实现共赢_站长访谈
·留住访客 如何最优化设计网站的首页?(2)_站长心得
·为什么在google上搜不到我的网页?_google推广
·google的秘密 搜索引擎利用软件的魔力加快奔跑_google推广
·域名与网站排名_站长心得
·怎样避免被搜索引擎视为作弊_站长心得
相关主题
  • powerpoint演示文档中声音的控制技巧_powerpoint教程
  • powerpoint幻灯片直接导入word_word教程
  • powerpoint2003命令在ppt2007中的位置_powerpoint教程
  • powerpoint演示文档添加另类型播放按钮_powerpoint教程
  • powerpoint中制作倒影艺术字_powerpoint教程
  • 西部数码虚拟主机

    友情链接
    CNNIC 西部数码
    万网 自助建站
    虚拟主机 asp空间
    域名注册 域名
    域名申请 主页空间
    论坛空间 网站空间
    国际域名 虚拟空间
    空间租用 DDOS防火墙
    成都主机托管 四川主机托管
    主机租用 服务器租用
    网站目录 自助建站
    虚拟主机 网址大全
    软件下载
    自助链接
    虚拟主机资讯 特价虚拟主机
    版权申明:本站文章均来自网络,如有侵权,请联系我们,我们收到后立即删除,谢谢!
    关于我们:站长天空:专业提供最新的站长资讯、在线教程、虚拟主机权威评测、虚拟主机性能对比、网站制作教程,开发教程,站长工具。包括网页制作教程、冲浪宝典、编程参考、操作系统、软件教学、行业动态等。
    特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有。
    发表评论 打印  刷新     关闭