zoukankan      html  css  js  c++  java
  • PB7中调用VC6的DLL

    原作者没有找到

    本文介绍了动态链接库的基本特点,给出了VC++建立DLL以及在PowerBuilder中调用VC++创建的DLL函数的编程实例,实现了通过DLL连接PowerBuilder和VC++编制的不同程序的目的。

      一、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语言的编程能力。 

     

     

    /********************************************************************************************************/

    注意事项:

     由于我是第一次写PB,对PB的IDE并不熟悉在测试这个例子中,不知道在哪儿声明DLL幸亏得到一位高手朋友的指点,

     选择(Declare) 所对应的Local External Functions在这儿下面写其DLL的声明

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

  • 相关阅读:
    屏蔽 优酷广告
    First Adventures in Google Closure -摘自网络
    Closure Compiler(封闭编辑器), Closure Inspector, Closure Templates, 封闭图书馆(Closure Library) Google- 摘自网络
    据说几年前,微信之父张小龙有一次入京到龙泉寺散心,心中关于微信的产品困惑久久不得解。无聊中,张小龙与寺中扫地僧攀谈起来,发现对方居然懂得技术和产品,深入聊天之后,张小龙震惊于对方的才学与见识,虚心请教,之后闭关七天回到深圳,微信终于大成。
    一个PHP书单 -摘自网络
    关于protel 99se 汉化后某些菜单消失的解决方法
    Protel画完原理图检查的时候出现了这些错误 #1 Error Multiple Net Identifiers
    protel99 se中出现许多Backup of 文件,修改过保存时,总会出现备份文件,怎么才能取消这一设置?
    protel 99se 加载库文件 files not recognised 解决办法-转
    Hosts 文件的作用
  • 原文地址:https://www.cnblogs.com/sail/p/2061881.html
Copyright © 2011-2022 走看看