在Delphi中如何ABC表示什么:如果ABC包含A,则程序继续运行,否则退出!谢谢

下面例子中自定义了条件标识符: WanYi; 標识符和定义它的指令都不区分大小写, 但大家一般惯用大写.

版权声明:本文为博主原创文章未经博主允许不得转载。 /aqtata/article/details/

这是一个Delphi的函数声明看上去很简单,只有一个参数而已但是真实情况呢?在编译成二进制代码后实际上函数的参数已经有2个了!


为了更详细的说明问题,先用Delphi写一个DLL导出一个接口,接口有一个Show方法


运行后直接弹出一个内存错误


以反汇编玳码的形式查看这个函数就能发现问题

可以看到,函数返回值是接口类型的时候实际上返回值是一个隐式的参数,是一个二级指针类型在Dephi中使用不会发现问题,因为它自动作出了优化

而在多语言混合编程中,这样直接返回一个接口或对象的时候就会出现内存为空的错誤

// 修改后的调用方法


最后可以总结出一点经验,当Delphi函数返回值为接口类型的时候函数会认为第一个参数是一个接口缓冲区,用于接受接口的实例对象

那么是否可以在不改变C++这边调用方式的前提下直接返回接口指针呢?答案也是肯定的只要把返回数据类型改为基础类型即可


由于函数返回值已不再是一个接口类型,Delphi也不会去调用接口的AddRef方法把引用计数+1了所以在创建接口后得手动调用AddRef方法

否则函数在结束后会自动释放Temp,导致返回值是一个野指针

我要回帖

更多关于 ABC表示什么 的文章

 

随机推荐