PowerBuilder调用Delphi写的Dll时发生的奇怪问题

减小字体 增大字体 作者:佚名  来源:本站整理  发布时间:2009-03-16 22:35:08

  因项目需要,我用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。问题解决。什么都正常了。

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



Tags:

作者:佚名
分享到: 微信 更多

栏目导航

本类热门阅览

  • 1PB中的数据窗口自动刷新技术
  • 2优化你的PowerBuilder程序
  • 3在PB中实现ftp传输
  • 4PB中读取地磅BCD解码
  • 5浅谈PB中动态DataWindow的技术应
  • 6PB修改数据库表结构的技巧
  • 7在PB中动态修改SQL语句
  • 8PB程序中在普通激光打印机上实现
  • 9pb实用代码集(全有例程)
  • 10如何发布独立的POWERBUILDER应用
  • 11如何制作PB安装程序
  • 12在pb中用winsock控件使用问题
  • 13PowerBuilder菜单属性的修改
  • 14PowerBuilder中实现数据窗口打印
  • 15在PB中调用外部程序并判断其运行
  • 16在MicroHelp Bar上显示时间
  • 17PowerBuilder制作IE风格的图标按
  • 18不同版本的PB所需要的运行时动态
  • 19用PB编写邮件应用程序
  • 20用PB做一个通用右键菜单
  • 相关文章

  • 循序渐进学习Power Bui...
  • 循序渐进学习Power Bui...
  • 循序渐进学习Power Bui...
  • 循序渐进学习Power Bui...
  • 循序渐进学习Power Bui...
  • 循序渐进学习Power Bui...
  • 循序渐进学习Power Bui...
  • 循序渐进学习Power Bui...
  • 循序渐进学习Power Bui...
  • 循序渐进学习Power Bui...
  • 循序渐进学习Power Bui...
  • 循序渐进学习Power Bui...
  • 循序渐进学习Power Bui...
  • 分布式PowerBuilder工作原理
  • 循序渐进学习Power Bui...
  • 循序渐进学习Power Bui...
  • 循序渐进学习Power Bui...
  • 循序渐进学习Power Bui...
  • 循序渐进学习Power Bui...
  • 使用PowerBuilder同时访问多个数...