dll 파일 생성 예

13535 단어 dll
인터넷에서 쓴 dll 파일의 생성과 실용적인 자료를 많이 보았는데 도르가 완전하지 않아서 모두 베껴 쓰고 베껴 썼다. 어떤 것은 아예 msdn의 원문을 옮겨 썼는데 정말 창의적이고 볼 만한 것이 없었다.그래서 배우고 실용적인 목적에 따라 스스로 실천하는 것을 여러분께 공유합니다.
 
전제: dll 생성 도구로 VS2010 사용
개술: 주로 하나의 해결 방안 중의 하나의 프로젝트를 구축함으로써 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++] - [예처리기] 옵션에서 시스템 생성 매크로 TEST 20140529EXPORTS (유사한 것은 모두 이런 매크로가 있을 수 있다) 는 것이 있으면 사용자 정의 매크로의 번거로움을 줄일 수 있다.
 
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
 
 
 
 
 
 
 
 

좋은 웹페이지 즐겨찾기