使用Delphi声明C++带函数的结构体实战 good
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对象能够继承,看来我真是孤陋寡闻了!!!
使用Delphi声明C++带函数的结构体实战 good的更多相关文章
- Delphi 中的结构体与结构体指针
好多程序都给结构体变量设定了一个结构体指针 例如: PAbc = ^TAbc; TAbc = record a: string[10]; b: string[5]; c: string[1]; end ...
- C语言 ---- 函数 结构体 iOS学习-----细碎知识点总结
函数的定义 返回值类型 函数名(形式参数列表) { 函数的实现 } 函数不允许嵌套定义 如果函数的定义在主调函数之后,那么要进行提前声明才能使用. // 匿名结构体,结构 ...
- Swift入门篇-结构体
前面主要是介绍swift语言中基本类型的用法,今天给大家介绍的是swift的结构体的用法,swift中结构体的用法和其他语言的用法,还有不太一样,不过您多敲几遍,就可以理解结构体,结构体在ios开发中 ...
- ios开发中的C语言学习—— 结构体简介
在开发过程中,经常会需要处理一组不同类型的数据,比如学生的个人信息,由姓名.年龄.性别.身高等组成,因为这些数据是由不同数据类型组成的,因此不能用数组表示,对于不同数据类型的一组数据,可以采用结构体来 ...
- 12、C#基础整理(结构体)
结构体 1.概念: 结构体是写在main函数外的数据结构,由不同类型的数据组合成一个整体,这些组合在一个整体中的数据是互相联系的 2.声明方式: struct 结构体名 { 成员变量(由类型名+成员名 ...
- 01.C语言关于结构体的学习笔记
我对于学习的C语言的结构体做一个小的学习总结,总结如下: 结构体:structure 结构体是一种用户自己建立的数据类型,由不同类型数据组成的组合型的数据结构.在其他高级语言中称为记录(record) ...
- C:结构体
结构体 构造类型:就是有基本的类型组成的 1.结构体 结构体是一种自定义的数据类型 和 int float 是一样的都可以定义变量 数组 只能存放一种类型的容器 结构体 可以存放多种数据类型 ...
- CAF(C++ actor framework)(序列化之结构体,任意嵌套STL)(一)
User-Defined Data Types in Messages(用户自定义类型)All user-defined types must be explicitly “announced” so ...
- C语言中 指针与结构体
就像数组一样,指向结构体的指针存储了结构体第一个元素的内存地址.与数组指针一样,结构体的指针必须声明和结构体类型保持一致,或者声明为void类型. 1 2 3 4 5 6 7 8 9 10 11 12 ...
随机推荐
- ZOJ 3603字符串操作
解题思路:找到公共子串然后升序输出 坑的地方就在于输入是存在相同字母的 #include <stdio.h> #include <algorithm> #include < ...
- Mapper XML Files详解
扫扫关注"茶爸爸"微信公众号 坚持最初的执着,从不曾有半点懈怠,为优秀而努力,为证明自己而活. Mapper XML Files The true power of MyBatis ...
- Mockito简介(转)
Mockito 是目前 java 单测中使用比较流行的 mock 工具.其他还有 EasyMock,JMock,MockCreator,Mockrunner,MockMaker 及 PowerMock ...
- 多图片/文件上传 - SwfUpload/PlUpload
<文件上传利器SWFUpload使用指南> <前端上传组件Plupload使用指南>
- ssh登录的时候,根本不给输入密码的机会,直接拒绝,是因为BatchMode的设置
BatchMode no“BatchMode”如果设为“yes”,passphrase/password(交互式输入口令)的提示将被禁止.当不能交互式输入口令的时候,这个选项对脚本文件和批处理任务十分 ...
- 正确处理Windows电源事件
简介为系统挂起与恢复而进行的应用准备步骤 曾几何时,当您正要通过应用提交或发布一些重要数据时,突然遇到一些急事需要处理,而且会耽误很长时间.当您完成任务回到电脑前时,发现电脑已经自动进入 了挂起状态, ...
- C++ Primer学习笔记2--c++标准库中的 vector、string 和 bitset 类型
一.string #include <string> using std::string 初始化函数: string s1; 默认构造函数 s1 为空串 ...
- perl中 wx返回的json需要encode_utf8($d);
$count is 9 now not support message 51 Wide character in print at /root/scanwx/lib/synccheck.pm line ...
- HBase概念学习(七)HBase与Mapreduce集成
这篇文章是看了HBase权威指南之后,依据上面的解说搬下来的样例,可是略微有些不一样. HBase与mapreduce的集成无非就是mapreduce作业以HBase表作为输入,或者作为输出,也或者作 ...
- MongoDB---性能优化---(1)
MONGODB数据架构 升级解决.计划 发现问题 应用server用户数的突然涌入,创建server反应慢 检查server,我发现,每次反应非常慢,至30ops 检查过程 .发现数据库查询缓 ...