C++builder调用VC dll.docVIP

  1. 1、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Cbuilder调用VCdll

?c++builder调用VC的dll以及VC调用c++builder的dll?? 解析__cdecl,__fastcall, __stdcall 的不同: 在函数调用过程中,会使用堆栈,这三个表示不同的堆栈调用方式和释放方式。 比如说__cdecl,它是标准的c方法的堆栈调用方式,就是在函数调用时的参数压入堆栈是与函数的声明顺序相反的,其它两个可以看MSDN,不过这个对我们编程没有太大的作用 --------------------------------------------------------------- 调用约定 调用约定(Calling convention)决定以下内容:函数参数的压栈顺序,由调用者还是被调用者把参数弹出栈,以及产生函数修饰名的方法。MFC支持以下调用约定: _cdecl 按从右至左的顺序压参数入栈,由调用者把参数弹出栈。对于C函数或者变量,修饰名是在函数名前加下划线。对于C++函数,有所不同。 如函数void test(void)的修饰名是_test;对于不属于一个类的C++全局函数,修饰名是_test@@ZAXXZ(怎么感觉像乱码??)。 这是MFC缺省调用约定。由于是调用者负责把参数弹出栈,所以可以给函数定义个数不定的参数,如printf函数。 _stdcall 按从右至左的顺序压参数入栈,由被调用者把参数弹出栈。对于C函数或者变量,修饰名以下划线为前缀,然后是函数名,然后是符号@及参数的字节数,如函数int func(int a, double b)的修饰名是_func@12。对于C++函数,则有所不同。所有的Win32 API函数都遵循该约定。 _fastcall 头两个DWORD类型或者占更少字节的参数被放入ECX和EDX寄存器,其他剩下的参数按从右到左的顺序压入栈。由被调用者把参数弹出栈,对于C函数或者变量,修饰名以@为前缀,然后是函数名,接着是符号@及参数的字节数,如函数int func(int a, double b)的修饰名是@func@12。对于C++函数,有所不同。 未来的编译器可能使用不同的寄存器来存放参数。 Dll中用 __declspec(dllexport)声明的函数: __declspec(dllexport)只是表示这个函数是一个DLL导出函数,而__stdcall是一种函数调用约定,两者应该是没有冲突的.??? 如:__declspec(dllexport)? void? __stdcall? aTry(); c++builder和vc描述符定义的区别 在c++builder中 ??????? __cdecl的函数输出前会带:_ ??????? __stdcall无特征,只输出函数名 ??????? __fastcall函数输出前带:@ ??????? 都无@nn后缀格式! 在vc中 ??????? __cdecl无特征,只输出函数名 ??????? __stdcall的函数输出前会带:_后缀带:@nn ??????? __fastcall函数输出前带:@后缀带:@nn c++builder调用VC的dll: 在VC中编写DLL时,使用了.def文件,在出口函数声明时也在前面加上了__declspec(dllexport)说明。把VC生成的DLL文件放在了当前目录下,使用BCB的命令行工具implib生成的.lib文件,具体格式为implib bcb.lib vc.dll,再把implib根据dll生成的LIB文件加入到工程中,再在工程中加入DLL出口函数的声明(函数名前加上了WINAPI,即__stdcall;每个函数定义的最前面也加上了__declspec(dllimport))。 而且由于BCB和VC++成立函数名转换的做法不同。所以在VC中最好是输出函数为C函数的DLL,如果输出函数是C++类,则可能无法调用。 我的解决办法(经过本人实验证明的,共2种) 方法1:VC编译c文件生成dll时导出函数头文件加上extern C{}关键字,函数声明和定义处再加调用约定描述符__cdecl,然后将函数声明和定义处都加上一个下划线就没有问题了。 EXAMPLE: 假设我VC的dll中包含int myFunction(void),.c文件中函数实现处的正确写法是: __declspec(dllexport) int __cdecl _myFunction(void) { ??????? // add your code here } .h文件中函数声明处的正确写法如下 __declspec(dllexport) int __cdecl _myFunction(void); BCB调用时只要包含lib文件,具体操作步骤: 运行i

文档评论(0)

shenlan118 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档