zoukankan      html  css  js  c++  java
  • 生成dll文件的示例

    看了好多网上写的关于dll文件生成和实用的资料发现多尔不全,都是抄来抄去,有的干脆就是搬用msdn上的原文,实在没有创意和可看的东西。于是本着学和实用的目的自己实践的东西分享给大家。

    大前提:使用VS2010作为dll生成工具

    概述:主要通过构建一个解决方案中的一个项目来演示如何定义和生成dll文件,在同一个方案中在创建一个项目主要用来进行生成dll的使用。

    简易结构图:

    testdll(解决方案名)

      |——makedll(生成dll项目名)

      |——testdll(使用dll项目名)

    makedll项目:

    先使用VS自动创建win32dll项目,手动添加dll.h 和 dll.cpp(生成项目时自动就有了)

    dll.h源码:

     1 #ifndef TEST20140529_H
     2 #define TEST20140529_H
     3 
     4 #include <iostream>
     5 #include <string>
     6 
     7 #pragma warning( disable : 4251 )
     8 
     9 //1 can export class type
    10 #ifdef TEST20140529_EXPORTS
    11 #define TESTCLASS_API _declspec(dllexport)
    12 #else
    13 #define TESTCLASS_API _declspec(dllimport)
    14 #endif // TEST20140529_EXPORTS
    15 
    16 //2 can't export class type
    17 //#ifdef TEST20140529_EXPORTS
    18 //#define TESTCLASS_API extern "C" _declspec(dllexport)
    19 //#else
    20 //#define TESTCLASS_API extern "C" _declspec(dllimport)
    21 //#endif // TEST20140529_EXPORTS
    22 
    23 
    24 class TESTCLASS_API TestClass
    25 {
    26 private:
    27     int m_nVar;
    28     std::string m_strVar;
    29 public:
    30     void set(int );
    31     void printfValue();
    32     void set_str(const std::string &);
    33     void printf_str();
    34 };
    35 TESTCLASS_API void printfValue(const int &);
    36 
    37 
    38 #undef TESTCLASS_API
    39 
    40 #endif // TEST20140529_H

    dll.cpp源码:

     1 // test20140529.cpp : 定义 DLL 应用程序的导出函数。
     2 //
     3 
     4 #include "stdafx.h"
     5 #include "test20140529.h"
     6 
     7 void TestClass::set(int v)
     8 {
     9     m_nVar = v;
    10 }
    11 void TestClass::printfValue()
    12 {
    13     std::cout << m_nVar << std::endl;
    14 }
    15 void TestClass::set_str(const std::string &str)
    16 {
    17     m_strVar = str;
    18 }
    19 void TestClass::printf_str()
    20 {
    21     std::cout << m_strVar << std::endl;
    22 }
    23 void printfValue(const int &v)
    24 {
    25     std::cout << v << std::endl;
    26 }

    还有一个可选的文件.def,这个文件添加不添加对于调用它的其他C++项目而言没有影响,但是对于其他语言来说可能比较有用,为了更通用,所以也研究了一下并写出来实践。

    dll.def源码:

    1 LIBRARY
    2 
    3 EXPORTS
    4 
    5 printfValue = ?printfValue@@YAXABH@Z                                                                                    @1
    6 cls_printfValue = ?printfValue@TestClass@@QAEXXZ                                                                        @2
    7 cls_printf_str = ?printf_str@TestClass@@QAEXXZ                                                                            @3
    8 cls_set = ?set@TestClass@@QAEXH@Z                                                                                        @4
    9 cls_set_str = ?set_str@TestClass@@QAEXABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z                @5

    解释:前面的是导出名称(必不可少),后面的是系统自定义的名称(可选),@数字是导出的顺序。

    更详细的可以参见msdn: http://msdn.microsoft.com/en-us/library/28d6s79h.aspx

    这个dll的创建主要也就这么多。

    注:这个项目的配置: [配置属性]-[c/c++]-[预处理器] 选项里 选择系统生成宏TEST20140529_EXPORTS(类似的都会有这么个宏),有了它就省去了自定义宏的麻烦。

    testdll项目:

    概述:这个项目简单主要实现dll文件的调用。

    直接在main文件里面实现使用就可以。

    main.cpp源码:

     1 #include <iostream>
     2 #include "../test20140529/test20140529.h"
     3 
     4 #pragma comment(lib, "../Debug/test20140529.lib")
     5 
     6 int main()
     7 {
     8     //1
     9     int v = 12;
    10     printfValue(v);
    11 
    12     //2
    13     TestClass obj;
    14     obj.set(v);
    15     obj.printfValue();
    16 
    17     //3
    18     TestClass obj2;
    19     obj2.set_str("haha");
    20     obj2.printf_str();
    21 
    22     //4
    23     TestClass obj3;
    24     obj3.set_str("nono");
    25     obj3.printf_str();
    26 
    27     return 0;
    28 }

    注:这个项目主要是对头文件的引用和lib库文件的调用。

    好了,太晚了,该下班了。

     补充:由于时间仓促说的可能不是特别明白,特别将能够正常运行的示例上传上来做个参考。

    我的博客的文件:test20140529.rar

  • 相关阅读:
    prototype的初步理解
    arguemnts的初步理解
    this的初步理解
    js的内存释放初步理解
    私有作用域的初级理解
    预解释的初级理解
    sublime3的安装和插件之类的
    ionic的常用命令总结以及正式发布的准备
    js的DOM的方法和属性总结
    AynsTask1
  • 原文地址:https://www.cnblogs.com/superstargg/p/3759992.html
Copyright © 2011-2022 走看看