美文网首页
使用C++创建动态库dll

使用C++创建动态库dll

作者: 浮生一城 | 来源:发表于2017-06-21 23:55 被阅读0次

    概述

    虽然最近临近期末考试,但是我还是抽了一些时间去搞C++,因为要在12月底之前写出一个本地文件搜索引擎,所以只能加紧学习啦!
    动态库,全称动态链接库(Dynamic Link Library),关于这东西的介绍,详见MSDN-DLL,这里只说说怎么用最简洁的方式生成自己的dll文件。

    环境

    • 此处默认使用visual studio 2017 community版本
    • windows 10 Pro 1703

    步骤

    至于怎么在visual studio 中新建工程,这个就不多说了吧,要是不会用VC++,出门别说自己是学C++的……
    但是有一些需要说明的,在工程向导中,一定记得勾选如图所示的按钮,才方便创建一个简洁而且完全自定义的C++ dll

    应用程序向导
    • 切记,一定要有导出符号,否则不方便其他语言(主要是C#)调用
    • 如果不勾选空项目,会默认生成dllmain.cpp和stdafx.h以及stdafx.cpp三个文件,而这三个文件基本上用不到……

    新建工程完毕后,在头文件和源文件中分别添加要创建的文件,此处以HelloWorld.cpp和HelloWorld.h为例分析

    代码分析

    HelloWorld.h

    #include <sdkddkver.h> //系统库,用于确定运行平台版本
    #include <Windows.h> //系统库,包含几乎所有windows API
    
    //一些必须的宏定义
    #ifdef HELLOWORLD_EXPORTS
    #define HELLOWORLD_API __declspec(dllexport)
    #else
    #define HELLOWORLD_API __declspec(dllimport)
    #endif
    
    namespace HelloWorld
    {
        class onScreen
        {
        public :
            static HELLOWORLD_API void Print(void);
            static static HELLOWORLD_API void Import(void);
        private:
        void am(void); //此函数未定义
        };
    }
    
    1. 宏定义解释
    • dllName_EXPORTS 输出符号定义,需在应用程序向导处勾选导出符号,在本例中为HELLOWORLD_EXPORTS
    • dllName_API 定义API函数的入口,需要在外部调用的函数需加此声明
    • dllName_API为__declspec()的宏定义,若定义dllexport,则不需要.def文件声明函数接口;若为dllimport则需.def文件显式声明函数接口
    1. 关于static
    • 必须使用static,因为外部调用非静态成员函数是违反语言规则的;需要访问非静态成员需要首先初始化它,然后调用
    1. 可以不使用namespace,此处是采用的C++的写法

    HelloWorld.cpp

    // HelloWorld.cpp : 定义 DLL 应用程序的导出函数。
    //
    
    #include "HelloWorld.h"
    #include <iostream>
    
    using namespace std;
    using namespace HelloWorld;
    
    void onScreen::Print(void)
    {
        cout << "Hello, VC++ Dll!" << endl;
    }
    
    void onScreen::Import(void)
    {
        onScreen::Print();
    }
    
    • 这段代码只是对HelloWorld.h中函数声明的定义,不需要太多解释
    • 到这里就可以启动生成了,会编译输出两个文件,.lib和.dll,如果需要在C++中调用,则需要lib文件进行编译,如果是在C#或者其他语言中调用,则仅需要dll文件即可
    • 下次聊聊在C++中的调用吧,顺道补上如何访问非静态成员的方法

    相关文章

      网友评论

          本文标题:使用C++创建动态库dll

          本文链接:https://www.haomeiwen.com/subject/azqxcxtx.html