标签:c style class blog code java
看了好多网上写的关于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库文件的调用。
好了,太晚了,该下班了。
标签:c style class blog code java
原文地址:http://www.cnblogs.com/superstargg/p/3759992.html