热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

使用vs2008制作dll文件,生成动态链接库

1.制作dll文件vs2008中,File>NewProject>OtherLanguage>Win32>Win32ConsoleApplic
1.制作dll文件
    vs2008中,File > New Project > Other Language > Win32 > Win32 Console Application. 输入项目名称:MyDll。点击【OK】,【Next】,选择dll单选按钮,完成。
    vs2008会自动生成一些代码,不用管它。创建MyDll.h,代码如下
    MyDll.h 为了提高可用性,写了可回带值的函数供参考
    Cpp代码  收藏代码
        //MyDLL.h  
        extern "C" _declspec(dllexport) int Max(int a, int b);  
        extern "C" _declspec(dllexport) int Min(int a, int b);  
        extern "C" _declspec(dllexport) bool cim2scada(char* cimId, char** scadaId); 
     
    创建MyDll.cpp
    Cpp代码  收藏代码
        // MyDll.cpp : Defines the exported functions for the DLL application. 
        // 
        #include "stdafx.h" 
        #include"MyDll.h"  
        #include  
         
        int Max(int a, int b)  
        {  
            if(a>=b)return a;  
            else  
                return b;  
        }  
        int Min(int a, int b)  
        {  
            if(a>=b)return b;  
            else  
                return a;  
        }   
         
        bool cim2scada(char* cimId, char** scadaId){ 
            char *result; 
            if(cimId == NULL){ 
                printf("空指针!"); 
                return false; 
            }else if(strlen(cimId) == 0){ 
                printf("cimId无值!"); 
                return false; 
            } 
         
            if(strcmp(cimId, "aaaaaa") == 0){ 
                result = "1000"; 
            }else if(strcmp(cimId, "bbbbbb") == 0){ 
                result = "2000"; 
            } 
            *scadaId = result; 
            printf("fun scadaId:%s\n", *scadaId); 
            return true; 
        } 
    
    编译一下,到工程的DEBUG目录,就可以找到MyDll.dll文件
2.创建测试程序  --- 动态加载DLL

    vs2008中,File > New Project > Other Language > Win32 > Win32 Console Application. 输入项目名称:DllTest。点击【OK】,【Next】,选择console单选按钮,去掉“预编译头”默认勾选项,完成。
    Cpp代码  收藏代码
        #include "windows.h" 
        #include  
         
        void main(){ 
            typedef int(*pMax)(int a, int b);   //定义个函数指针pMax指针指向int XX(int  a, int b)这样一个类型的函数
            typedef int(*pMin)(int a, int b);  
            typedef bool(*pcim2scada)(char* cimid, char** scada); 
            HINSTANCE HDLL;  
            HDLL=LoadLibrary(L"MyDll.dll");//加载动态链接库MyDll.dll文件;  
            pMax Max=(pMax)GetProcAddress(HDLL,"Max");  
            pMin Min=(pMin)GetProcAddress(HDLL,"Min");  
            pcim2scada cim2scada=(pcim2scada)GetProcAddress(HDLL,"cim2scada");  
            int a = Max(5, 12);  
             
            char cimId[] = "aaaaaa"; 
            char * scadaId = ""; 
            bool b = cim2scada(cimId, &scadaId); 
         
            printf("Max结果为%d",a);  
            printf("cimId:%s, scadaId:%s", cimId, scadaId); 
            FreeLibrary(HDLL);//卸载MyDll.dll文件;  
        } 
    
    编译一下
    拷贝MyDll.dll文件到DllTest项目的Debug目录下
    打开一个控制台(cmd),进入DllTest > Debug目录,运行DllTest.exe
    输出结果:
    Cpp代码  收藏代码
        fun scadaId : 1000 
        Max结果为12 
        cimId:aaaaaa, scadaId:1000 

=====================================================================================================
这里总结一下vs2008下创建dll并使用dll导出函数的方法,当然方法还有很多,找出一个自己比较习惯的方法就好!
一:生成DLL
1:创建DLL工程

      文件->新建->项目->visual c++->win32->win32控制台应用程序(win32项目也可以)
      填写项目名称MyDLL->确定->下一步->DLL(附加选项 对空项目打钩)->完成。
      到这里DLL工程就创建完毕了,下面新建两个文件MyDLL.cpp和MyDLL.h。
      MyDLL.cpp内容如下:

    #include
    using namespace std;
    #include "MyDLL.h"
    
    int Add(int &a,int &b)
    {
        return a+b; 
    }

      MyDLL.h内容如下: 

    #pragma once
    #define DLL_EXPORT __declspec(dllexport)
    extern "C" DLL_EXPORT int Add(int &a,int &b);
     点击生成,则dll文件就生成了,vs2008不能直接生成lib文件,这个时候就需要我们在建立dll工程的时候 再新建一个def文件,默认生成然后重新生成就能够得到lib文件了

2:调用DLL文件导出的接口函数 ---- 静态加载DLL

       vs2008这个IDE非常好用,我们这里玩一下,在上面创建的DLL工程中,再新建一个项目来直接调用DLL导出函数。
       右键解决方案->添加->新建项目->建立一个空的常规工程 testMyDLL,下面新建两个文件testMyDLL.cpp和testMyDLL.h

testMyDLL.cpp内容如下:


//静态加载DLL需要把生成DLL的时候产生的LIB文件跟DLL文件还有头文件一起放在需要调用的工程中,这样就可以直接使用DLL中的函数。


    #include "testMyDLL.h"
    #pragma comment(lib,"..\\debug\\MyDLL.lib")
    #include
    using namespace std;
    
    int main()
    {
        int a =3;
        int b =2;
        cout<    
        getchar();
    }

testMyDLL.h内容如下:

    #pragma once
    #define DLL_EXPORT __declspec(dllexport)
    
    extern "C" DLL_EXPORT int Add(int &a,int &b);
这里需要注意testMyDLL.cpp文件中调用lib的这句话:

    #pragma comment(lib,"..\\debug\\MyDLL.lib")

这里需要指明lib所在的文件夹,当然我们也可以在生成dll的MyDLL工程中,指定lib和dll文件的输出路径,直接到testMyDLL工程下。

推荐阅读
  • C++字符字符串处理及字符集编码方案
    本文介绍了C++中字符字符串处理的问题,并详细解释了字符集编码方案,包括UNICODE、Windows apps采用的UTF-16编码、ASCII、SBCS和DBCS编码方案。同时说明了ANSI C标准和Windows中的字符/字符串数据类型实现。文章还提到了在编译时需要定义UNICODE宏以支持unicode编码,否则将使用windows code page编译。最后,给出了相关的头文件和数据类型定义。 ... [详细]
  • Introduction(简介)Forbeingapowerfulobject-orientedprogramminglanguage,Cisuseda ... [详细]
  • #include<iostream>usingnamespacestd;intmain(){HereIseperatemynumberbe ... [详细]
  • 本文介绍了闭包的定义和运转机制,重点解释了闭包如何能够接触外部函数的作用域中的变量。通过词法作用域的查找规则,闭包可以访问外部函数的作用域。同时还提到了闭包的作用和影响。 ... [详细]
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • Python正则表达式学习记录及常用方法
    本文记录了学习Python正则表达式的过程,介绍了re模块的常用方法re.search,并解释了rawstring的作用。正则表达式是一种方便检查字符串匹配模式的工具,通过本文的学习可以掌握Python中使用正则表达式的基本方法。 ... [详细]
  • 展开全部下面的代码是创建一个立方体Thisexamplescreatesanddisplaysasimplebox.#Thefirstlineloadstheinit_disp ... [详细]
  • 3.223.28周学习总结中的贪心作业收获及困惑
    本文是对3.223.28周学习总结中的贪心作业进行总结,作者在解题过程中参考了他人的代码,但前提是要先理解题目并有解题思路。作者分享了自己在贪心作业中的收获,同时提到了一道让他困惑的题目,即input details部分引发的疑惑。 ... [详细]
  • 本文介绍了在使用vue和webpack进行异步组件按需加载时可能出现的报错问题,并提供了解决方法。同时还解答了关于局部注册组件和v-if指令的相关问题。 ... [详细]
  • 本文介绍了iOS数据库Sqlite的SQL语句分类和常见约束关键字。SQL语句分为DDL、DML和DQL三种类型,其中DDL语句用于定义、删除和修改数据表,关键字包括create、drop和alter。常见约束关键字包括if not exists、if exists、primary key、autoincrement、not null和default。此外,还介绍了常见的数据库数据类型,包括integer、text和real。 ... [详细]
  • 如何搭建Java开发环境并开发WinCE项目
    本文介绍了如何搭建Java开发环境并开发WinCE项目,包括搭建开发环境的步骤和获取SDK的几种方式。同时还解答了一些关于WinCE开发的常见问题。通过阅读本文,您将了解如何使用Java进行嵌入式开发,并能够顺利开发WinCE应用程序。 ... [详细]
  • 本文介绍了使用哈夫曼树实现文件压缩和解压的方法。首先对数据结构课程设计中的代码进行了分析,包括使用时间调用、常量定义和统计文件中各个字符时相关的结构体。然后讨论了哈夫曼树的实现原理和算法。最后介绍了文件压缩和解压的具体步骤,包括字符统计、构建哈夫曼树、生成编码表、编码和解码过程。通过实例演示了文件压缩和解压的效果。本文的内容对于理解哈夫曼树的实现原理和应用具有一定的参考价值。 ... [详细]
  • 使用eclipse创建一个Java项目的步骤
    本文介绍了使用eclipse创建一个Java项目的步骤,包括启动eclipse、选择New Project命令、在对话框中输入项目名称等。同时还介绍了Java Settings对话框中的一些选项,以及如何修改Java程序的输出目录。 ... [详细]
  • 本文记录了作者对x265开源代码的实现与框架进行学习与探索的过程,包括x265的下载地址与参考资料,以及在Win7 32 bit PC、VS2010平台上的安装与配置步骤。 ... [详细]
  • 在C#中,使用关键字abstract来定义抽象类和抽象方法。抽象类是一种不能被实例化的类,它只提供部分实现,但可以被其他类继承并创建实例。抽象类可以用于类、方法、属性、索引器和事件。在一个类声明中使用abstract表示该类倾向于作为其他类的基类成员被标识为抽象,或者被包含在一个抽象类中,必须由其派生类实现。本文介绍了C#中抽象类和抽象方法的基础知识,并提供了一个示例代码。 ... [详细]
author-avatar
背对夕阳宝宝_732
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有