在小组开发中,应用程序部分采用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. Android之ksoap2-android详解与调用天气预报Webservice完整实例

    Google为Android平台开发Web Service客户端提供了ksoap2-android项目,在这个网址下载开发包http://code.google.com/p/ksoap2-androi ...

  2. 分享非常有用的Java程序 (关键代码)(四)---动态改变数组的大小

    原文:分享非常有用的Java程序 (关键代码)(四)---动态改变数组的大小 /** * Reallocates an array with a new size, and copies the co ...

  3. JVM调优总结(七)-典型配置举例1

    以下配置主要针对分代垃圾回收算法而言. 堆大小设置 年轻代的设置很关键 JVM中最大堆大小有三方面限制:相关操作系统的数据模型(32-bt还是64-bit)限制:系统的可用虚拟内存限制:系统的可用物理 ...

  4. 总线接口与计算机通信(二)SPI总线

    SPI总线协议及SPI时序图详解  : http://blog.163.com/sunshine_linting/blog/static/44893323201181482335951/ 浅谈SPI总 ...

  5. TImage也有OnClick事件,可以当按钮使用,配上合适的图片(背景透明,效果前凸)更是几乎以假乱真

    本质上TImage与TSpeedButton没有什么区别,都是没有句柄的,但都可以执行OnClick事件.有空分析一下.

  6. 不用SWIG,Go使用C++代码的方式

    将C++代码用C作一次封装,就可以让Go调用了. 这是一个C++头文件: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 #ifndef CGO_CPPGO_C ...

  7. Javascript 中的非空判断 undefined,null, NaN的区别

    JS 数据类型 在介绍这三个之间的差别之前, 先来看一下JS  的数据类型. 在 Java ,C这样的语言中, 使用一个变量之前,需要先定义这个变量并指定它的数据类型,是整型,字符串型,.... 但是 ...

  8. Java内部类——成员内部类

    成员内部类的意思就是,一个外层类里面包含着一个非static的class,举例如下: class OuterClass { //变量,函数定义... class InnerClass { //变量,函 ...

  9. UVA它11292 - Dragon of Loowater

    Problem C: The Dragon of Loowater Once upon a time, in the Kingdom of Loowater, a minor nuisance tur ...

  10. access数据库:怎么直接从access里把数据里同样的文字替换成空字符""

    access数据库:怎么直接从access里把数据里同样的文字替换成空字符"" 搜所到文字后,替换的项里写"",就是了.一定要是英文的""