在小组开发中,应用程序部分采用Delphi7,一些组件使用C++做。在今天将一个动态库的C++接口声明头文件转换为D7的Unit单元时,一切都很顺利,直到遇到下面这样一个另类的东西:

typedef struct tagRecord
{
 int val;
 int getvalplus()
 {
  val++;
  return val;
 }
}TRecord, *PRecord;

带函数的结构体!面对这个面目狰狞的家伙,我开始无所适从,狂在GOOGLE、BAIDU里通过关键字“Delphi 带函数的记录类型”、“Delphi C++ 结构体 函数”、“Delphi record function”......结果都是无功而返。

一边搜索,还一边通过编码测试来寻找问题解决门道。起初我尝试效仿采用函数指针的方式,结果函数体无法实现,更不用说访问结构体其他成员了。

后面又一次试着采用class而非record类型来声明:

PRecord = ^TRecord;
  TRecord = class
  public
    val: integer;
    function getvalplus():integer;
  end;

在接口部分:function ShowValue(rcd: PRecord):integer;stdcall;external 'Structdll.dll';

参数rcd无论声明为PRecord还是Pointer,传递进去之后debug调试出来的值根本就不对,疑似某对象的地址之类的数字。去俺们圈子的技术群里请教高手结果还引来“变态、真贱”的一顿骂,哪儿有这么用的?不吃饱了撑得吗?那你就考虑考虑采用代理模式来迂回解决吧!......这个时候,我几乎绝望了,特别无助,我的印象里,在Win32开发这片沃土里,Delphi和C++本就一脉相承的啊,但面对这个细节的时候我发现原来景色并不是那么美好。

无奈之下到CSDN社区的Delphi->API板块发帖提问,这时也临近中午,吃了几口面包,吞了两缸凉白开困意来了,撂倒就是一觉......哪知一觉醒来发现有人回帖了,虽然他在D2007上验证通过,但我还是抱着试试看的想法在D7上开始测试。没成想,嘿!果然有效哎!你看看:

在dll库里的声明(C++):

typedef struct tagRecord
{
 int val;
 int getvalplus()
 {
  val++;
  return val;
 }
}TRecord, *PRecord;

extern "C" __declspec(dllexport) int __stdcall ShowValue(TRecord *rcd)
{
 int val = rcd->getvalplus();
 CString ss = _T("");
 ss.Format("Value is:%d", val);
 AfxMessageBox(ss);
 return 0;
}

在D7中的声明:

type
  
PRecord = ^TRecord;
  TRecord = Object
  
public
    val: integer;
    function getvalplus():integer;
  end;

function ShowValue(rcd: PRecord):integer;stdcall;external 'Structdll.dll';

implementation

function TRecord.getvalplus():integer;
begin
  val := val + 1;
  Result := val;
end;

在D7中的调用:

procedure TfrmMain.Button1Click(Sender: TObject);
var
  r: TRecord;
  pr: PRecord;
begin
  r.val := 10;
  pr := @r;
  r.getvalplus;
  ShowMessage(inttostr(r.val));
  ShowValue(pr);
end;

 

        后记:以前在DOS下,以C/C++为主,Pascal只用过Turbo Pascal4.0,对以后Pascal的版本并不十分了解,今天看了网友housisong的留言,才知道我所谓的新功能--有限栈对象,Delphi中早就有了,如Delphi7.0就可以使用Object关键字定义栈对象,而且比2007的record类型还完善一些,record不能继承,而object对象能够继承,看来我真是孤陋寡闻了!!!

http://blog.csdn.net/henreash/article/details/25313019

使用Delphi声明C++带函数的结构体实战 good的更多相关文章

  1. Delphi 中的结构体与结构体指针

    好多程序都给结构体变量设定了一个结构体指针 例如: PAbc = ^TAbc; TAbc = record a: string[10]; b: string[5]; c: string[1]; end ...

  2. C语言 ---- 函数 结构体 iOS学习-----细碎知识点总结

    函数的定义     返回值类型 函数名(形式参数列表) {        函数的实现     } 函数不允许嵌套定义 如果函数的定义在主调函数之后,那么要进行提前声明才能使用. // 匿名结构体,结构 ...

  3. Swift入门篇-结构体

    前面主要是介绍swift语言中基本类型的用法,今天给大家介绍的是swift的结构体的用法,swift中结构体的用法和其他语言的用法,还有不太一样,不过您多敲几遍,就可以理解结构体,结构体在ios开发中 ...

  4. ios开发中的C语言学习—— 结构体简介

    在开发过程中,经常会需要处理一组不同类型的数据,比如学生的个人信息,由姓名.年龄.性别.身高等组成,因为这些数据是由不同数据类型组成的,因此不能用数组表示,对于不同数据类型的一组数据,可以采用结构体来 ...

  5. 12、C#基础整理(结构体)

    结构体 1.概念: 结构体是写在main函数外的数据结构,由不同类型的数据组合成一个整体,这些组合在一个整体中的数据是互相联系的 2.声明方式: struct 结构体名 { 成员变量(由类型名+成员名 ...

  6. 01.C语言关于结构体的学习笔记

    我对于学习的C语言的结构体做一个小的学习总结,总结如下: 结构体:structure 结构体是一种用户自己建立的数据类型,由不同类型数据组成的组合型的数据结构.在其他高级语言中称为记录(record) ...

  7. C:结构体

    结构体 构造类型:就是有基本的类型组成的 1.结构体  结构体是一种自定义的数据类型 和 int float 是一样的都可以定义变量 数组 只能存放一种类型的容器 结构体   可以存放多种数据类型  ...

  8. CAF(C++ actor framework)(序列化之结构体,任意嵌套STL)(一)

    User-Defined Data Types in Messages(用户自定义类型)All user-defined types must be explicitly “announced” so ...

  9. C语言中 指针与结构体

    就像数组一样,指向结构体的指针存储了结构体第一个元素的内存地址.与数组指针一样,结构体的指针必须声明和结构体类型保持一致,或者声明为void类型. 1 2 3 4 5 6 7 8 9 10 11 12 ...

随机推荐

  1. Qt 状态机框架学习(没学会)

    Qt状态机框架是基于状态图XML(SCXML) 实现的.从Qt4.6开始,它已经是QtCore模块的一部分.尽管它本身是蛮复杂的一套东西,但经过和Qt的事件系统(event system).信号槽(s ...

  2. Qt学习之路(54): 自定义拖放数据对象

    前面的例子都是使用的系统提供的拖放对象 QMimeData 进行拖放数据的存储,比如使用 QMimeData::setText() 创建文本,使用 QMimeData::urls() 创建 URL 对 ...

  3. 使用jQuery的attr方法来修改onclick值

    这篇文章主要介绍了通过jQuery的attr修改onclick值的解决方法 ,需要的朋友可以参考下 var js = "alert('B:' + this.id); return false ...

  4. CF 319C(Kalila and Dimna in the Logging Industry-斜率DP,注意叉积LL溢出)

    C. Kalila and Dimna in the Logging Industry time limit per test 2 seconds memory limit per test 256 ...

  5. Deamon Thread 讲解

    The daemon thread's life cycle is same with the life cycle of the application which starts this daem ...

  6. 新书:《Liferay Portal 6.1最佳实践门户网站建设》

    新书:<Liferay Portal 6.1最佳实践门户网站建设>   <Liferay Portal 6.1门户站点建设最佳实践>是国内第一本全面介绍Liferay Port ...

  7. 【floyd】HDU 1874 畅通project续

    之后的题解偏重有用/总结性质,尽量理解算法本身而不是题,时间复杂度什么的也能够放放. 非常久之前做过这个题,当时使用dijkstra做的,关于几个最短路算法,分类的话能够分为下面几种. 1.单源最短路 ...

  8. apache一键安装脚本

    近期在玩apache,首先安装apace要配置apr.apr-util,pcre,而配置这些基本都是千篇一律.所谓程序猿的精神就是降低反复性的劳动,以下请看我写的apache安装脚本: 这个脚本我也放 ...

  9. 程序启动报错:ORA-12505;PL/SQL却可以登录的解决方法

    一.异常{ ORA-12505, TNS:listener does not currently know of SID given in connect descriptor The Connect ...

  10. jquery子元素过滤选择器

    :nth-child('索引值')//获取指定元素下的某个子元素的位置,索引从1开始: //偶数行                 //$('li:nth-child(even)').addClass ...