下面是个PowerBuilder调用Delphi写的Dll时发生的奇怪问题教程,撑握了其技术要点,学起来就简单多了。赶紧跟着图老师小编一起来看看吧!
【 tulaoshi.com - 编程语言 】
因项目需要,我用Delphi写了一个连接数据库把数据导出到Sql文件的dll,其中使用了TADOQuery组件。本以为PowerBuilder也应该没问题,可谁知还是一样的问题。这下子我想不通了。Python中的ctypes模块使用的C中的调用方法,参数传递方式应该和PowerBuilder一样,可是为什么PB里面还是不行呢?同事让我在Dll里面多写一个输出方法试试看,那好,我又写了下面这样一个方法:
(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/bianchengyuyan/) 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.tulaoshi.com/bianchengyuyan/)来源:http://www.tulaoshi.com/n/20160219/1621230.html
看过《PowerBuilder调用Delphi写的Dll时发生的奇怪问题》的人还看了以下文章 更多>>