如何用VC编写供PB调用的DLL

原创 2006年06月16日 16:55:00

和编写一般的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。

 

 

如何在PowerBuilder与DLL之间传递参数

如何在PowerBuilder与DLL之间传递参数 如何在PowerBuilder与DLL之间传递参数 Powersoft中国有限公司 霍军 --------------------...
  • aasmfox
  • aasmfox
  • 2016年06月27日 08:26
  • 1309

C#调用PB写的com组件dll

背景 小编为了使用C#去模仿PB代码的加密算法,结果发现PB算法中,的long类型只有21亿,实际上传入的数值达到了78亿,造成了数据溢出,精度丢失的情况。 然而PB的算法已经使用C#不可以还...
  • diudiu5201
  • diudiu5201
  • 2017年03月07日 23:31
  • 1155

VB中调用VC++开发的DLL

转自:http://lanshanlhy.blog.163.com/blog/static/302294762010112832031218/ 再谈在VB中调用VC++开发的DLL  再谈...
  • xl19900502
  • xl19900502
  • 2016年02月22日 11:17
  • 481

VC++ (MFC)调用 C#生成DLL的方法

参考博客中转载的VC++ (MFC)调用 C#生成DLL的两种方法的第一种,结合自己编写魔方机器人程序遇到的问题(再将Thistlethwaite’s algorithm由C#语言转换成C++语言的时...
  • shizhoulei
  • shizhoulei
  • 2015年04月29日 14:43
  • 3201

pb调用vc dll约定

VC PB dll VC6中的函数调用约定:         调用约定        堆栈清除    参数传递         __cdecl         调用者      从右到左,通过堆...
  • youyongyoumou
  • youyongyoumou
  • 2015年06月02日 14:00
  • 354

c++封装dll供c#调用

在合作开发时,C#时常需要调用C++DLL,当传递参数时时常遇到问题,尤其是传递和返回字符串是,现总结一下,分享给大家: VC++中主要字符串类型为:LPSTR,LPCSTR, LPCTSTR,...
  • qq_17835733
  • qq_17835733
  • 2016年10月21日 10:54
  • 1640

labview调用VC++生成的动态链接库DLL

labview调用c dll
  • u013935644
  • u013935644
  • 2016年11月30日 13:56
  • 2812

VC中调用dll函数的两种方法

一、显式调用 1、定义函数指针 typedef int (*dll_mul)(int a,int b); 2、加载dll,并获取其程序实例句柄 HINSTANCE hdll=loadlibrary(...
  • lzhui1987
  • lzhui1987
  • 2015年11月05日 09:11
  • 1200

PB调用C#编写的DLL

文章出自:http://www.cnblogs.com/eric_ibm/archive/2012/07/06/dll.html   C#以其简单易用,功能强大深受大家喜爱.PowerBuilde...
  • lijianhe043
  • lijianhe043
  • 2013年11月12日 09:36
  • 2565

PB调用C#编写的DLL

C#以其简单易用,功能强大深受大家喜爱.PowerBuilder作为C/S的MIS开发工具,十分简单灵活,开发时间短,开发及维护成本低,一直是中小企业信息管理系统的首选开发工具.但是PB的局限性限制了...
  • bear_79
  • bear_79
  • 2014年02月09日 15:41
  • 567
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:如何用VC编写供PB调用的DLL
举报原因:
原因补充:

(最多只允许输入30个字)