`
buliedian
  • 浏览: 1237786 次
  • 性别: Icon_minigender_2
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

如何用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具有兼容性
分享到:
评论

相关推荐

    pb_test_PB与C语言_pb调用dll_

    标题中的"pb_test_PB与C语言_pb调用dll_"表明我们关注的是如何在PowerBuilder (PB) 应用程序中调用用C语言编写的动态链接库(dll)。描述进一步证实了这是一个关于使用PB10和Visual C++ 6(vc6)创建的dll进行互操作性...

    PB调用VC创建的DLL在MIS中的设计与实现1

    ### PB调用VC创建的DLL在MIS中的设计与实现 #### 摘要与背景 随着信息技术的发展,管理信息系统(MIS)在各行业的应用越来越广泛。在MIS的开发过程中,通常需要利用OLE技术来实现Excel报表等功能。虽然Power...

    PB9调用C++的dll实例

    管理系统常用pb开发,少不了外部接口,PB9外部接口调用C++的dll,测试程序。

    pb9调用vc的dll

    8. **错误处理**:在PB9中调用DLL函数后,必须检查返回值和错误码,以便捕获并处理可能出现的问题。 9. **调试与测试**:在开发过程中,使用Visual C++的调试器测试DLL,而PB9的调试器则用于调试PB端的代码,确保...

    pb调用vCdll的摄像程序

    标题中的“pb调用vCdll的摄像程序”指的是使用PowerBuilder(PB)这个编程工具通过动态链接库(DLL)来调用Visual C++(VC)编写的DLL文件,实现摄像头视频的采集功能。在软件开发中,DLL是一种可重用代码的库,可以...

    PB调用VC创建的标注win32 dll 不用注册

    5. **PB调用DLL**:在PB中,调用VC++创建的DLL需要使用“External Function”或“External Library”方法。首先,需要在PB中声明DLL的函数原型,包括函数名、参数类型和返回值类型。然后,可以在PB的代码中像调用...

    (完整版)vc6.0编写DLL文件及vb调用示例.docx

    本教程将详细介绍如何使用Microsoft Visual C++ 6.0(简称VC6.0)来创建DLL文件,并展示如何在Visual Basic(VB)中调用这些DLL中的函数。 首先,创建DLL文件的过程分为以下几个步骤: 1. **创建新工程**:在VC6.0...

    PB调用java组件SatJni

    SatJni是C++编写的动态链接库,实现了C#,PB,Delphi,VB,VC等对Java的调用,能让你很容易地调用成熟的java类库和第三方...示例中演示了PB调用webservice服务(无需代理对象)得到电话号码和天气信息、调用Base64和MD5等。

    PB调用VC创建的DLL在MIS中的设计与实现

    ### PB调用VC创建的DLL在MIS中的设计与实现 #### 摘要与背景 随着信息技术的发展,管理信息系统(MIS)在各行业的应用越来越广泛。在MIS的开发过程中,通常需要利用OLE技术来实现Excel报表等功能。PowerBuilder...

    PB_调用VC_创建的DLL_在MIS_中的设计与实现.pdf

    ### PB调用VC创建的DLL在MIS中的设计与实现 #### 概述 在管理信息系统(MIS)的开发过程中,特别是在需要处理大量数据、生成报表或与外部设备交互时,开发人员常面临多种技术的选择与整合。PowerBuilder(简称PB)...

    串口应用、多线程、怎么编写DLL(PB105 + VC2008 + sql server2000)

    在PB105中,使用`LoadLibrary`和`GetProcAddress`函数加载并调用DLL中的函数。确保PB和DLL之间的数据类型兼容,否则可能导致错误。 对于数据库操作,SQL Server 2000提供了一个强大的关系型数据库管理系统。在PB105...

    PB10.5 + VC2008 socket 例程(VC源码,PB源码,socket应用源码)

    在本例程中,VC2008作为主要的通信模块,封装成动态链接库(DLL),以供不同编程语言调用。而PowerBuilder则负责数据的展示和接收VC处理后的数据。 首先,我们需要理解socket编程的基础概念。Socket是网络编程中的...

    PB用mymail发关邮件

    在描述中提到,“PB调用mymail发送邮件,是用VC编写的DLL文件,里面有使用说明”,这意味着mymail.dll是一个由Visual C++(VC)开发的组件,用于处理邮件发送任务。DLL文件是一种共享库,可以被多个程序调用,以减少...

    应用vc实现打印机输出

    最后,我们需要注意的是,VC中的打印功能不仅仅是编写好代码那么简单,还需要对MFC(Microsoft Foundation Classes)有一定的了解,以及熟悉Windows的消息机制和事件驱动编程模型。通过调试和测试,确保程序在不同...

    广东食品健康证系统_企业端DLL调用指南

    其中,`gdyj.dll`为核心接口,`gdyj.lib`为VC调用所需的链接库,`gdyjdll.h`为VC调用必需的头文件,而`NetCaCertUtilitATX.dll`用于读取数字证书。 #### 安装与注册 - **安装步骤**:首先,将DLL目录下的所有文件...

    pbni实现位与和位或

    PBNI是PowerBuilder的一个扩展,它允许开发者直接调用C++编写的动态链接库(DLL),从而在PB应用程序中实现更高效、更底层的计算。 在编程中,位运算通常用于处理二进制数据,它们是对单个比特进行操作的逻辑运算。...

    pb cef3 浏览器控件

    vs2015 + pb11.5 pbni + cef3 81.0.4044.138实现,在PB中调用cef3实现浏览器控件,实现了url加载、重新加载、停止加载、前进、后退等功能; pb12.5可自行升级使用; vs2015生成的dll,需要vc14运行库支持。

    PowerPrint 1.1 DLL(包括vc源码)

    这些示例代码通常包括了调用DLL API的基本示例,以及如何处理打印事件和错误的实例,帮助开发者快速掌握PowerPrint 1.1 DLL 的使用方法。 尽管提供的压缩包中只列出了INETWH32.DLL这个文件,但我们可以推测这可能是...

    VC++生成DLLVC++生成DLL

    4. **扩展性**:DLL的使用可以扩展应用程序的功能,比如在PowerScript中调用DLL中的函数,可以实现原本PowerScript无法完成的操作,如图像处理或与特定硬件设备通信。 #### 二、VC++创建DLL 在Visual C++环境中...

    各种语言与VC6.0数据类型的对应关系

    本篇文章主要探讨的是如何在Visual C++ 6.0(简称VC6.0)环境下,与其他语言如VB、C#、PB(PowerBuilder)进行数据类型的对应,以便于在这些语言之间进行动态库调用。 首先,我们来看一个具体的VC6.0函数示例: ``...

Global site tag (gtag.js) - Google Analytics