如何用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。

 

 

相关文章推荐

用PB调用VC编制DLL

使用PowerBuilder(PB)开发应用程序时,可调用VC语言编制的动态链接库(DLL)来实现在PB中不容易实现的功能。实践中我们曾使用VC建立DLL,并在PB中调用VC创建的DLL函数,应用效果...
  • meeweed
  • meeweed
  • 2011年11月04日 14:21
  • 712

pb9调用vc的dll

  • 2013年04月15日 17:21
  • 755KB
  • 下载

PB调用C#编写的DLL

PB虽然说用的人越来越少,但是其应用的场合还是很多的.
  • ccy_qty
  • ccy_qty
  • 2011年08月04日 11:43
  • 2659

PB8调用使用C++与C#分别编写生成解压缩带有密码的zip压缩文件的动态链接库dll(部分内容转自互联网)

本文章编写的原因,是由于zlib无法解压缩由ICSharpCode.SharpZipLib.dll压缩的文件对作者的项目造成了困难,于是结合网上关于这方面的资料整理了这篇文章,希望对大家有所帮助,减少...

使用QT+MinGW编写动态库dll供VC或VB调用

前言 版本 dll的编写和调用及查看工具 DLL的基本认识 查看工具 编辑 调用 QT下dll动态库的制作 错误记录 VB调用时的错误记录 参考前言在MSVC下编写一个Windows dll库供调用是...

vc 编写dll 供java调用

(1)首先写一个java类,内容如下: package com.bw.gb2py; public class GB2PY {  static  { System.loadLibrary("G...

使用PB编写dll文件---看介绍source文件的地方

在Windows CE中,所有的驱动程序都以dll形式存在。Dll文件可以用EVC来开发,也可以使用PB来开发,使用PB开发驱动程序,可以跟NK同时进行编译,要比EVC来的方便一点。这篇文章就只要介绍...

pb调用精伦电子sdtapi.dll读卡函数的心得

函数原型: 1、端口初始化函数    原    型:int InitComm (int iPort)    说    明:本函数用于打开串口或USB并检测读卡设备是否就绪。    参   ...
  • wulula
  • wulula
  • 2012年08月30日 21:15
  • 2865

在bs系统中客户端调用dll组件(js调用pb写的com组件)

用JavaScript直接调用dll组件或其他com组件是不行的,但是JavaScript可以调用activex控件,因此,为了实现js调用dll,在两者之间增加一层activex.即 Ja...
  • tgh1981
  • tgh1981
  • 2011年09月15日 11:20
  • 4744
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:如何用VC编写供PB调用的DLL
举报原因:
原因补充:

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