博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Delphi和VC混合编程总结
阅读量:5011 次
发布时间:2019-06-12

本文共 1549 字,大约阅读时间需要 5 分钟。

项目开发到了最后阶段,内核基本成型,Demo开发最终提上日程。

为了尽快完成Demo开发,毕竟Demo只是为了演示,所以决定使用来完成,因为做界面Delphi的效率是相当高的。而我们的内核引擎是使用C++开发,VC编译,这就涉及到了Delphi和VC的混合编程,这里将这几天来的经验总结共享出来,需要的时候可以随时查看。

目前的程序结构是这样的,内核使用dll封装为SDK,交付兄弟部门或者其他公司做二次开发,Demo采用Delphi主调内核,并实现结果呈现。

首先,在接口一层,要保证Delphi能够和VC进行数据交互,所以需要对应相关的数据类型。同时这里不推荐在接口函数层使用复杂数据类型,因为如果参数和返回值过于复杂,是不能简单通过基本类型来进行传递的,这样编译器内部就会进行编码,以完成复杂数据类型的传递。但是不同的语言,甚至不同的编译器的内部实现不同,很容易导致复杂数据类型数据传递失败,而产生无效传递的情况,切记切记。

基本类型对照表如下:

VC --------------------- Delphi

int                               Integer

unsigned int              Cardinal
char                           Byte
wchar_t                     WideChar
int*                             PInteger
unsigned int*            PCardinal
char                           PByte
wchar_t                     PWideChar

在数据类型对应的情况下,才能保证类型能够正确传递

其次,接口函数调用规范的统一

由于函数调用过程中函数参数要通过堆栈进行传递,而参数在堆栈中所占空间的释放问题由谁进行,直接导致函数调用规范的提出,这就是我们知道的stdcal,cdcel,pascal,fastcal等调用规范,为了保证参数的正确传递和结果的正确获取,需要在两种语言中统一调用规范。

这里使用stdcal,没有什么特殊的理由来选择这个,目的只有一个,那就是统一,以保证参数传递正确

最后,Delphi中声明VC动态链接库的导出函数

格式举例:

原型:

const wchar_t* __stdcall testW(const wchar_t* waveFile, const wchar_t* waveFmt, const wchar_t* grammarList, const wchar_t* params, int *recogStatus, int *result);

function test(waveFile:PWideChar;

                          const wav_Fmt: PWideChar;
                          const grammarList:PWideChar;
                          const params:PWideChar;
                          recogStatus:PInteger;
                          func_result:PInteger): PWideChar;stdcall;
                                                 external “qisr.dll” name 'testW';

简单解释一些函数声明的含义:

function 用于定义函数
external 关键字用于定义导出该函数的动态链接库名
name 用于定义动态链接库中导出函数的导出名

如果有VC链接库开发经验的朋友可能会发现,为什么Delphi中没有类似VC中对应于dll的lib导入库呢?这里简单解释一下,其实VC中与dll配套的lib文件起到的作用也就是告诉连接器静态链接导出函数的时候,从哪里获取导出函数入口地址用的,实际没有实体代码,这里Delphi中的声明代码其实起到的也就是这个作用。由于lib没有实体代码,所以很容易通过dll获取对应的lib导入库。

转载于:https://www.cnblogs.com/jiqiwoniu/p/4565407.html

你可能感兴趣的文章
py自动化之环境配置
查看>>
Winodws SNMP服务安装和配置(Windows 2003 & 2008 R2)
查看>>
红黑树-想说爱你不容易
查看>>
【题目】英文字符进行频率的统计,直方图输出
查看>>
LeetCode-Binary Tree Level Order Traversal
查看>>
COM组件开发实践
查看>>
yii2 源码分析1从入口开始
查看>>
浅谈网站推广
查看>>
Away3D基础之摄像机
查看>>
Leetcode 128. Longest Consecutive Sequence
查看>>
程序员必须知道的几个Git代码托管平台
查看>>
导电塑料入梦来
查看>>
C# 线程手册 第五章 扩展多线程应用程序 - 什么是线程池
查看>>
笔记1126ASP.NET面试题(转)
查看>>
考研路茫茫--单词情结 - HDU 2243(AC自动机+矩阵乘法)
查看>>
HTTP运行期与页面执行模型
查看>>
tableView优化方案
查看>>
近期思考(2019.07.20)
查看>>
Apache2.4使用require指令进行访问控制
查看>>
冗余关系_并查集
查看>>