zoukankan      html  css  js  c++  java
  • VC++ chap19 动态链接库 VC++ 孙鑫

    19.2 win32 DLL的创建和使用

    1.VC++ 新建 Win32 Dynamic-Link Library类型的工程,选项 an empty dll project

    2, 添加C++源文件 Dll.cpp, 编写代码,加法和减法

    19.2.1 Dumpbin 命令

    1,安装目录vc98in目录下, 执行dumpbin命令。如无法执行,运行vcvars32.bat这个批处理文件,建立环境信息

    2,如果要查看一个DLL提供的导出函数,使用/exports选项来运行 dumpbin命令。 在DLL1.dll 文件所在目录下,输入下述命令并回车

    Dumpbin -exports dll1.dll

    19.2.2

    为了让dll 导出一些函数,在需要被导出的函数前添加 _declspec(dllexport)

    19.3隐式方式加载dll

    19.3.1 利用 extern 声明函数

    1,对库函数添加声明,extern 声明

    2,将dll1.lib文件复制到dlltest程序所在目录

    3projectsetting , 选择 link选项卡, 在object/library modules 中 输入 dll1.lib

    4,现在可以执行程序。

    如果要查看可执行程序的输入信息,以及加载的dll信息,在dlltest.exe目录下输入 dumpbin -imports dlltest.exe

    19.3.2 depends工具

    19.4 完善Win32DLL例子

    DLL工程添加一个头文件 

    在调用此头文件的项目里, #include "..DLL11DLL11.h

    Note: 太奇怪的路径

    19.5

    DLL中导出类

    #include <windows.h>

    #include <stdio.h>

    Void Point::output(int x, int y)

    {

    //返回调用者进程当前正在使用的那个窗口的句柄

    HWND hwnd = GetForegrounfWindow();

    //获取DC

    HDC  hdc=GetDC(hwnd);

    Char buf[20];

    Memset(buf,0,20);

    Sprintf(buf,""x=%d,y=%d",x,y);

    TextOut(hdc,0,0,buf,strlen(buf));

    //释放DC

    ReleaseDC(hwnd,hdc);

    }

    可以不导出整个类

    只对类中的某个函数放置宏,用于导出

    19.6名字问题

    1,函数加上限定符  extern "C"

    2, 上述方法 在函数改变调用约定,如添加_stdcall 关键字。

    标准调用约定就是WINAPI调用约定,也就是pascal 调用约定。 这时导出函数名字会发生改变

    3,通过模块定义文件(DEF)解决上述问题

    添加dll2.def 文件

    LIBRARY DLL2   //指定动态链接库的内部名称 

    EXPORTS //表面dll将要导出的函数

    Add

    Subtract

     

    19.7 显示加载方式加载dll

    19.7.1 loadlibary 函数

    客户程序只需要.dll 文件, 不需要函数声明的头文件和引入库文件

    1,复制dll2.dll, 删除dll.lib 连接,

    2,使用动态方式加载动态链接库时,用

    Hmodule Loadlibary(lpctstr lpfilename); //将指定的可执行模块映射到调用进程的地址控件。

    3,获取该动态链接库中导出函数的地址

    Farproc GetProcAddredd( hmodule  hModule, lpcstr lpProcName);

     

    加载dll2.dll,并访问它提供的导出函数

    1,定义hmodule 变量, loadlibrary

    2,宏定义函数指针类型,再定义变量, getprocaddress

    3,判断函数指针变量,有误则返回

    4,调用函数

     

    19.7.2 调用约定

    dll中导出函数采用标准调用约定时,访问该dll的客户端程序也应该采用该约定类型来访问相应的导出函数 

    19.7.3 根据序号访问dll 的导出函数

    不用函数命, 而用函数序号  makeintresource(1);

    19.8 DllMain函数

     

    19.9  MFC DLL

    MFC 扩展 DLL 与 MFC 常规DLL 区别是,前者可以导出MFC类,后者只能导出自己编写的c++类。

     

    采用动态加载方式使用dll时,在需要访问时,调用 loadlibrary函数加载该dll

    当不再需要访问dll时,调用 freelibrary 释放对该dll 的引用。

  • 相关阅读:
    go-web摘抄1-基础知识
    arduino3-机械臂
    Arduino-2 使用按键开关
    Arduino-1 点亮小灯
    树莓派的语音识别
    gitlab的环境搭建及使用
    python数据处理 2
    idea 无法创建class文件
    Intellij IDEA添加database无法显示表等问题
    Intell idea 添加 jd反编译插件
  • 原文地址:https://www.cnblogs.com/aprilapril/p/3184383.html
Copyright © 2011-2022 走看看