这个DELPHI函数如何转成C++的声明?

geochway 2016-08-08 09:42:33
我在C++BUILDER的项目中加入了一个DELPHI的.pas模块,
想直接使用其中的函数(由于代码比较复杂,不想转成C++代码),

DELPHI单元中的定义:
unit OleComCall;
implementation
function GridOut(datFile:string; grdFile:string; bmpFile:string):integer;

C++BUILDER中的声明:
int _pascal GridOut(String datFile, String grdFile, String bmpFile);

编译通过,但是连接通不过,显示 unreoleved fuction....

不知道是声明不对还是其它的问题,请高手指点一下如何才能实现二者代码共享?
...全文
499 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
ooolinux 2016-08-11
  • 打赏
  • 举报
回复
引用 7 楼 FASM_FASM 的回复:
[quote=引用 6 楼 u010165006 的回复:] [quote=引用 5 楼 FASM_FASM 的回复:] [quote=引用 4 楼 u010165006 的回复:] [quote=引用 1 楼 FASM_FASM 的回复:] 应该是:
extern "C" int __fastcall GridOut(String* datFile, String* grdFile, String* bmpFile);
这个为什么要加extern "C"呢?C++方式编译不行吗?[/quote] 这个只是强调该函数符号名是C方式的而非C++方式的(c++名称碎解后会变成类似?GridOut@12@@_NN这个名称,具体要看编译器)。[/quote] 我的意思在CB中使用PAS中的函数都要声明为extern "C"吗? PAS函数中String datFile参数转到CB就是指针吗?[/quote]
引用 6 楼 u010165006 的回复:
[quote=引用 5 楼 FASM_FASM 的回复:] [quote=引用 4 楼 u010165006 的回复:] [quote=引用 1 楼 FASM_FASM 的回复:] 应该是:
extern "C" int __fastcall GridOut(String* datFile, String* grdFile, String* bmpFile);
这个为什么要加extern "C"呢?C++方式编译不行吗?[/quote] 这个只是强调该函数符号名是C方式的而非C++方式的(c++名称碎解后会变成类似?GridOut@12@@_NN这个名称,具体要看编译器)。[/quote] 我的意思在CB中使用PAS中的函数都要声明为extern "C"吗? PAS函数中String datFile参数转到CB就是指针吗?[/quote] 不是啊,我说的是全局函数。对象方法就不是,c++builder有专门扩充的与delphi接口的关键字(普通C++编译器根本不识别)。 delphi中的对象实例对应到C++中就是指针。[/quote] PAS中的全局函数在CB中都要声明为extern "C"吗?
FASM_FASM 2016-08-11
  • 打赏
  • 举报
回复
引用 6 楼 u010165006 的回复:
[quote=引用 5 楼 FASM_FASM 的回复:] [quote=引用 4 楼 u010165006 的回复:] [quote=引用 1 楼 FASM_FASM 的回复:] 应该是:
extern "C" int __fastcall GridOut(String* datFile, String* grdFile, String* bmpFile);
这个为什么要加extern "C"呢?C++方式编译不行吗?[/quote] 这个只是强调该函数符号名是C方式的而非C++方式的(c++名称碎解后会变成类似?GridOut@12@@_NN这个名称,具体要看编译器)。[/quote] 我的意思在CB中使用PAS中的函数都要声明为extern "C"吗? PAS函数中String datFile参数转到CB就是指针吗?[/quote]
引用 6 楼 u010165006 的回复:
[quote=引用 5 楼 FASM_FASM 的回复:] [quote=引用 4 楼 u010165006 的回复:] [quote=引用 1 楼 FASM_FASM 的回复:] 应该是:
extern "C" int __fastcall GridOut(String* datFile, String* grdFile, String* bmpFile);
这个为什么要加extern "C"呢?C++方式编译不行吗?[/quote] 这个只是强调该函数符号名是C方式的而非C++方式的(c++名称碎解后会变成类似?GridOut@12@@_NN这个名称,具体要看编译器)。[/quote] 我的意思在CB中使用PAS中的函数都要声明为extern "C"吗? PAS函数中String datFile参数转到CB就是指针吗?[/quote] 不是啊,我说的是全局函数。对象方法就不是,c++builder有专门扩充的与delphi接口的关键字(普通C++编译器根本不识别)。 delphi中的对象实例对应到C++中就是指针。
ooolinux 2016-08-10
  • 打赏
  • 举报
回复
引用 5 楼 FASM_FASM 的回复:
[quote=引用 4 楼 u010165006 的回复:] [quote=引用 1 楼 FASM_FASM 的回复:] 应该是:
extern "C" int __fastcall GridOut(String* datFile, String* grdFile, String* bmpFile);
这个为什么要加extern "C"呢?C++方式编译不行吗?[/quote] 这个只是强调该函数符号名是C方式的而非C++方式的(c++名称碎解后会变成类似?GridOut@12@@_NN这个名称,具体要看编译器)。[/quote] 我的意思在CB中使用PAS中的函数都要声明为extern "C"吗? PAS函数中String datFile参数转到CB就是指针吗?
FASM_FASM 2016-08-10
  • 打赏
  • 举报
回复
引用 4 楼 u010165006 的回复:
[quote=引用 1 楼 FASM_FASM 的回复:] 应该是:
extern "C" int __fastcall GridOut(String* datFile, String* grdFile, String* bmpFile);
这个为什么要加extern "C"呢?C++方式编译不行吗?[/quote] 这个只是强调该函数符号名是C方式的而非C++方式的(c++名称碎解后会变成类似?GridOut@12@@_NN这个名称,具体要看编译器)。
ooolinux 2016-08-09
  • 打赏
  • 举报
回复
引用 1 楼 FASM_FASM 的回复:
应该是:
extern "C" int __fastcall GridOut(String* datFile, String* grdFile, String* bmpFile);
这个为什么要加extern "C"呢?C++方式编译不行吗?
ccrun.com 2016-08-09
  • 打赏
  • 举报
回复
直接把.pas文件加入到C++Builder的工程就行了,IDE会在编译时自动生成对应的头文件。
FASM_FASM 2016-08-08
  • 打赏
  • 举报
回复
引用 1 楼 FASM_FASM 的回复:
应该是:
extern "C" int __fastcall GridOut(String* datFile, String* grdFile, String* bmpFile);
BTW: c++ builder 可以使用pas单元,只需把要用到的 pas 单元文件加入工程就可以了。但是有一个问题,c++ builder并不会马上生成 c++ 所需要的 HPP头文件,这时引用PAS单元中的代码就没有自动完成功能了,单独编译还会报错,说是“某某没有定义”。有一个小技巧,PAS单位文件加入工程后,先BUILD一次,将这个工程重新 build 一次,不是make,不要管能否通过,这时IDE就会调用相关程序把pas单元编译一次,生成hpp头文件,接下来就可以正常引用pas单元中的内容了。注意生成的HPP文件不要人工改动,让c++ builder维护就可以了,如果修改了PAS单元中的定义,重新build一次,HPP文件就更新好了。
FASM_FASM 2016-08-08
  • 打赏
  • 举报
回复
应该是:
extern "C" int __fastcall GridOut(String* datFile, String* grdFile, String* bmpFile);

13,825

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧