PB中使用VC++编制的DLL

一、DLL概述:

动态链接库(Dynamic-Link Library),简称DLL,是基于Windows程序设计的一个非常重要的组成部分。使用DLL有许多优点:

(1)使用DLL的动态连接不是将库代码拷贝,只在程序中记录函数的入口点和接口,在程序执行时才将库代码装入内存,如果有多个程序使用相同的DLL,也只需将DLL在内存中装载一次,节省了内存开销。
   (2)DLL是基于Windows的程序模块,它不仅包含可执行代码,还可以包含数据,各种资源,扩大了库文件的使用范围。
  (3)对于一个大型的、不断更新的应用程序,可以将许多重复的功能写成DLL,用主程序调用,这样既减少了开发的工作量,又提高了访问速度。
  (4)DLL丰富了PowerScript语言的编程能力,可以使用PowerScript函数集之外的函数。例如:用户可能编写图象处理系统来浏览文件并将其存放于数据库,该应用需使用浏览器,但用PowerScript语言未提供做这类工作的函数,为了操纵设备,需要与设备本身环境通信,该环境一般是厂商提供的动态链接库。
   (5)DLL独立于编程语言,大多数WINDOWS编程环境都允许主程序调用DLL中的函数。即可以用VC++、VB、PowerBuilder、Delphi、汇编语言等建立DLL,然后在不同语言编制的应用程序中调用它。

下面用一个实例说明通过DLL实现PowerBuilder程序和VC++程序之间的连接。

二、 VC++创建DLL

VC++5.0中可以用MFC AppWizard自动生成Win32 DLL和MFC AppWizard DLL,启动VC之后,从File | New菜单项,选择New对话框中的Projects标签,选择新项目为MFC AppWizard(dll),输入工程名pbdll,点击OK按钮,弹出图1-1所示对话框,选择DLL类型为:Regular DLL using shared MFC DLL,然后点击Finish按钮。这样,AppWizard将自动创建一个包含基本要素的DLL框架,接着手工添加代码。

打开pbdll.cpp文件,添加如下函数:

extern "C" _declspec ( dllexport )
int PASCAL out_num(int x)
{
   int y;
   char msg[30];
   y=x > >2;
   sprintf(msg, "计算结果:%o ! ", y);
   ::MessageBox(NULL, msg, "信息", MB_OK);
   return 0;
}

以上声明了函数out_num(),输入参数为一个整型数,作移位运算后,用对话框将计算结果显示出来。   接着打开pbdll.def文件,在EXPORTS下输入函数说明out_num,文件内容如下:

LIBRARY "pbdll"
DESCRIPTION 'pbdll Windows Dynamic Link Library'

EXPORTS
; Explicit exports can go here
   out_num @1

最后编译生成动态链接库pbdll.dll。

三、在PowerBuilder中调用VC++创建的DLL函数

为了在PowerBuilder应用程序中调用存放在动态链接库pbdll.dll中的函数out_num(),需要事先声明。在声明时要明确:

(1)函数的作用范围是全局的还是局部的。全局声明可使该函数用于整个应用,局部声明仅使该函数在对象的脚本中有效。
   (2)必须指明函数返回的数据类型、传递参数的个数和类型,并将存放该函数的动态链接库的名字告诉PowerBuilder。

声明完成后,应用程序可以调用函数out_num() ,调用该函数的代码与调用任何标准的PowerScript函数一样,区别在于:该函数存放在动态链接库中,调用它时,动态链接库装入内存,函数执行。

下面是PowerBuilder中被调用函数的使用声明:

Function int out_num ( int irow ) LIBRARY "pbdll.dll"

在PowerBuilder中调用函数out_num()代码如下:

int irow,retcode
irow=dw_1.rowcount()
retcode=out_num(irow)

四、 加载DLL

当PowerBuilder应用程序调用外部函数时,动态链接库装入内存。操作系统会在如下位置查找动态链接库:

(1)EXE文件运行的目录。
  (2)Windows的系统目录。

如果没有找到DLL,应用程序将产生运行错误,显示一个对话框,见图1-2(略)。如果找到DLL,它就被映射到程序的内存空间。

五、 结束语

DLL为不同编程环境下的应用程序之间的连接提供了方便,节省了内存,提高了速度,同时也丰富了PowerScript语言的编程能力。

时间: 2024-10-04 11:01:09

PB中使用VC++编制的DLL的相关文章

在低版本的vc中使用vc 10.0的新特性

/*! 在低版本的vc中使用vc 10.0的新特性 created by : andrew.wu (erpingwu@gmail.com) */ vc 10.0提供了一些新的特性,最引人注目的莫过于lambda, 但vs2010 beta内存占用之多也不得不让人心生退让. 高手 7cat 指出 "vc ide 只是一个壳" 那么如果利用 vc 10.0 编译器的新功能? 以vc9为例, 注意 Tools->Projects and Solutions->VC++ Direc

mfc-LabView中调用MFC-Wizard生成的DLL实现自定义文件对话框功能出错

问题描述 LabView中调用MFC-Wizard生成的DLL实现自定义文件对话框功能出错 VC创建MFC-Wizard生成的Dll,在导出函数MyFileOpen中调用由CFileDialog派生类CMyFileDlg实现自定义文件对话框.再在LabView中引用库函数节点调用MFC生成的DLL,输入输出参数设置输入类型int32.输出为C字符串指针即为文件对话框返回的选中目标文件路径. 如上配置完成后,运行弹出1097错误,用error_out屏蔽后,返回路径没有输出结果.DLL调试执行My

分享如何在VB中调用VC编写的DLL_vb

一般来说,VB和VC共同编程有3种方式:一种是VC生成DLL,在VB中调用DLL:一种是VC生成ActiveX控件(.ocx),在VB中插入:还有一种是在VC中生成ActiveX Automation服务器,在VB中调用.相对而言,第一种方法对VC编程者的要求最低,但要求你的伙伴进行配合,我推荐这种方法. 先说说VC++的编程.首先在VC++中生成Win32 DLL工程.在这个工程中添加几个函数供VB用户调用.一个DLL中的函数要想被VB调用,必须满足两个条件:一是调用方式为stdcall,另一

解决ASP中Connection对像封装dll问题

     asp代码保密一直是令人头痛的问题,目前没有非常好的解决方案,无非用vb编译成dll,但工作量实在太大,于是一直苦苦寻求着另一种途径,本文详细介绍关于解决ASP中Connection对像封装dll问题的文章专题. 中午,突然灵感一发,"为什么不尝试用加密数据库?",通过对数据库设一个高强度的密码,然后用vb封装connection对像,将密码信息写在dll里,然后通过asp创建组件方式调用,就算人家拿了我的代码,也无法改动数据库! 于是,开始了一步步既痛苦又刺激的旅程.vb三

怎样在C#中调用Delphi6写的DLL

我在编写一个系统时遇到了一个问题,无法在C#中调用Delphi6写的DLL,只因为DLL的参数是string类型的.然后在网上找相关的资料,还是没有结果.经过我的再三琢磨,现在已经解决,特写此文章与大家分享我的喜愉!Dellphi DLL文件:///////////////////////////////////////////////////////////////////library mydll; uses SysUtils, Classes; {$R *.res}function Out

PB中如何实现数据模糊查询

本文主要介绍如何在pb中根据数据窗口中的字段对数据窗口进行模糊查询.本系统的代码示例采用Power Builder6.5进行演示. 代码及设计: 1. 新建一个窗口,命名为w_query.在窗口中放入一个数据窗口控件,命名为dw_master.在dw_master中放入一个数据窗口:放置一个按钮,命名为cb_query.见下图: 2. 新建一个结构(structure)命名为str_result_column,其参数如下: 3. 在dw_master增加两个用户事件,命名为ue_action_q

在网页中调用VC写的对话框

要想在网页中调用VC写的对话框,那就得创建一个OCX了,下面将一步一步教你怎么写OCX: 第一步选择"MFC ActiveX ControlWizard",写入创建工程的名字,然后一路狂按"NEXT",直到"Finish",至此一个简单的MFC型的OCX框架已完成了; 第二步在资源中添加一对话框,并创建一个对话框的新类; 第三步就得为OCX添加方法了,见图:ClassWizard->Add Method,选择OK: 接着给方法添加以下代码:

如何在NodeJS中调用SS生成的DLL

要想在NodeJS中调用SS生成的DLL, 需要借助EdgeJS. EdgeJS: http://tjanczuk.github.io/edge/ 如果你还不知道如何在SS 中生成DLL, 请查看: Spider Studio 新版本 (x-mas) - 可以引入第三方程序集, 可以将脚本生成为DLL 下面以曾经写过的XML/JSON互转的脚本为例 (C#中 另辟蹊径解决JSON / XML互转的问题) 说明如何在NodeJS中应用SS DLL: 1. 安装edgejs npm install

在pb中使用WINSOCK控件的方法

随着资源共享和实时通讯的需要,很多计算机应用程序早已甩开单兵作战的模式,转入联合行动. 网络在计算机世界里,越来越发挥着举足轻重的作用.在WINDOWS应用程序中,处理实时通讯最常用到的还是MICROSOFT公司提供的WINSOCK控件.许多资料都细述了WINSOCK在VB中的使用方法,就连WINDOWS本身提供的hlp文件也是针对VB而写的.笔者因为实际应用的需要,琢磨出了WINSOCK控件在PB中的应用方法.好东西不敢独自享用,拿出来与大家共享. 下面以一个简单程序为例,说明WINSOCK控