如何用VC编写供PB调用的DLL (转)

如何用VC编写供PB调用的DLL[转帖]
2008-11-01 12:40
VC PB dll和编写一般的DLL方法相同,
需要注意以下两点:
(1)调用约定C函数有_stdcall、_cdecl、_fastcall等多种调用约定,调用约定用来说明函数参数的压栈顺序和由谁(函数自身还是调用者)来修改堆栈。关于调用约定的详细说明,请参考我转载的另一篇文章。编写供PB调用DLL,请使用_stdcall调用约定,如下所示:
extern "C" _declspec(dllexport) int _stdcall GetInt(char* name)
{
...
}
(2)def文件
在VC 中,如果生成DLL可以不使用.def文件,只需要在VC 的函数定义前加__declspec(dllexport)修饰就可以了。生成的DLL VC 用户可以直接使用,但PB、VB等用户使用会遇到函数名转换的问题。因为VC 对于__declspec(dllexport)声明的函数会进行名称转换,如下面的函数:__declspec(dllexport) int _stdcall GetStr() 编译后会转换为 GetStr@0,这样在PB、VB中声明函数时应该声明GetStr@0,
如果函数带有参数,转换后的函数名将更加复杂,这使PB、VB用户使用起来很不方便。在def文件中由EXPORT输出函数可解决这个问题。
如dll要输出如下两个函数:
extern "C" _declspec(dllexport) int _stdcall GetInt(char* name);
extern "C" _declspec(dllexport) char* _stdcall GetStr(int id);则def文件书写如下(TEST为工程名):
LIBRARY "TEST"
DESCRIPTION 'TEST Windows Dynamic Link Library'EXPORTS
; Explicit exports can go here
GetInt @1
GetStr @2 编译生成DLL后,在PB中要调用GetStr函数,只需做如下声明即可:
function string GetStr(int a) library("TEST.dll"); 注意,如果您建的是Win32 Dynamic-Link Library 工程,def文件需要自己创建,然后把它加入工程,def文件名需和工程名相同。如您的工程名为test,则创建test.def。
//

然后将def加入VS2005,VC6工程中,只要有DEF文件并将其添加到工程中,VC6就可以自动地生成DLL与其相应的Lib文件了。

但是VS2005不一样,需要指定DEF文件

工程 > 属性中的链接器,然后找到"输入"这一项. 在 "模块定义文件" 中输入 testdll.def.

//

在C++ Builder中编写DLL的时候函数如果给外部程序调用应这样声明:
extern "C" __declspec(dllexport) char * __stdcall Test(char * StrTest)
在PB中如果调用这样的DLL文件应这样声明:
FUNCTION String Test(String StrTest) LIBRARY "Test.dll"
如果不需要返回值:
subroutine Test(String StrTest) LIBRARY "Test.dll"
如果要是以函数参数的形式返回在PB中的参数可以这样定义
subroutine Test(ref char StrTest[]) LIBRARY "Test.dll"
FUNCTION关键字一般用于声明WIN32API函数声明
subroutine一般用于调用外部DLL(外部函数一般采用部分函数参数作为返回值的形式)
C++Builde中调用约定有 __fastcall、__pascal、__stdcall、__cdecl 四个关键字
编写DLL与编写其他函数没什么区别,如果要表露出函数给外部程序用应用__stdcall关键字以指定生成的DLL具有兼容性
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值