• VC++6.0如何创建与调用动态链接库(dll)


    VC++支持的DLL:

    DLL的编制与具体的编程语言及编译器无关,动态链接库随处可见,VC++支持三种DLL:非MFC动态库、MFC规则DLL和MFC扩展DLL。DLL导出函数(或变量、类)可供应用程序调用;DLL内部函数只能在DLL程序内使用,应用程序无法调用它们。 

    导出函数的声明方式: 

    一种在函数声明类型和函数名之间加上“_declspec(dllexport)”。 

    另外一种采用模块定义(.def)文件声明,需要在库工程中添加模块文件,格式如下: 

    LIBRARY 库工程名称 

    EXPORTS 导出函数名 

    DLL的调用方式: 

    一种静态调用,由编译系统完成对DLL的加载和应用程序结束时DLL的卸载。 

    另外一种动态调用,由编程者用API函数加载和卸载DLL(DLL加载—DLL函数地址获取—DLL释放)方式。 

    示例: 

    一、 函数—-创建动态链接库(MFC规则DLL) 

    1. New–projects–MFC AppWizard(dll)–Regular DLL using shared MFC DLL //取名为MFC_dll 

    2. def文件中添加:函数名(Add_new) 

    3. h文件中添加:外部函数声明//求和函数,函数名为Add_new 

    extern “C” __declspec(dllexport) int __stdcall Add_new(int a,int b); 

    4. cpp文件中添加: 外部函数实现 

    extern “C” __declspec(dllexport) int __stdcall Add_new(int a,int b) 

    {

      return a+b;

    5. build–set active configuration–win32 release–ok 

    6. 生成 

    7. 根目录下release文件夹中dll,lib与根目录下h文件即为所需

    二、 函数—-调用动态链接库(把MFC_dll.dll和MFC_dll.lib拷到工程所在目录) 

    //静态调用(.h可以写到.cpp文件中) 

    1. new–projects–win32 console application–an empty project 

    2. 添加h文件:(test.h) 

    #pragma comment(lib,”MFC_dll.lib”) //告诉编译器DLL相对应的lib文件所在路径和文件名 

    extern “C”_declspec(dllimport) int _stdcall Add_new(int a,int b);//声明导入函数 

    3. 添加cpp文件:(main.cpp) 

    #include “test.h” 

    int main() 

      cout<<Add_new(10,3); 

      return 0; 

    }

    //动态调用 

    #include <stdio.h> 

    #include <windows.h> 

    typedef int (* lpAddFun)(int ,int);//定义一个与Add_new函数接受参数类型和返回值均相同的函数指针类型 

    int main() 

      HINSTANCE hDll;//句柄 www.2cto.com 

      lpAddFun addFun;//函数指针 

      hDll=LoadLibrary(“dllTest.dll”);//动态加载DLL模块句柄 

      if(hDll) 

      { 

        addFun=(lpAddFun) GetProcAddress(hDll,”Add_new”);//得到所加载DLL模块中函数的地址 

        if(addFun) 

        { 

          int result=addFun(2,3); 

          printf(“%d”,result); } FreeLibrary(hDll);//释放已经加载的DLL模块 

        } 

      return 0; 

    }

     from:http://www.2cto.com/kf/201112/112977.html

  • 相关阅读:
    VS2019调试 asp.net core 2.2 出现《ANCM In-Process Handler Load Failure 发布后启动错误处理》处理
    网页上显示数学公式的三种方案
    FileStream实现多线程断点续传(已封装)
    绝对定位不脱离文档流的方法
    百度地图InfoWindow弹窗圆角
    并发:线程池异步执行与创建单独的线程执行
    互斥锁和自旋锁的区别
    事务的特性和隔离级别
    线程不安全与线程安全示例
    多线程过去与现在
  • 原文地址:https://www.cnblogs.com/zhangmo/p/2607032.html
Copyright © 2020-2023  润新知