[독서 노트] 동적 링크 라이브러리

4984 단어 독서 노트
최근에 DLL 파일을 쓸 때 자주 버그가 발생하기 때문에 오늘 짬을 내서 동적 링크 라이브러리의 기초 지식을 자세히 연구해 보겠습니다.《VC++심층상해》는 당연히 첫 번째 참고 자료죠.
DLL은 Windows 운영 체제와 함께 탄생한 것으로, 오랜 역사와 오랜 시련을 겪어 배울 만하다.물론 이 녀석도 만들었다DLL Hell.(진 호주: DLL Hell - DLL 재난은 마이크로소프트의 DLL이 업그레이드할 때 서로 다른 버전으로 인해 응용 프로그램이 실행되지 못할 수 있는 재난이다. 가장 먼저 COM 프로그래밍을 해야 한다. 일부 목마나 바이러스가 일부 시스템의 DLL을 바꾸면 윈도 전체가 움직이지 않을 수 있다는 것을 모두가 알고 있을 것이다. 이것이 바로 DLL Hell이다).하지만 DLL을 모르는 것이 무섭다는 점도 일깨워 준다.
강력한 Windows API의 모든 함수는 DLL에 포함됩니다.가장 중요한 것은 세 가지가 있다.
  • Kernel32.dll: 메모리, 프로세스, 스레드를 관리하는 함수를 포함합니다. 예를 들어CreateThread입니다.[Base Services]
  • User32.dll: CreateWindow와 같은 사용자 인터페이스 작업을 수행하는 함수를 포함합니다.[ Windows USER ]
  • GDI32.dll: 그림을 그리고 텍스트를 표시하는 함수를 포함합니다.[Graphics Device Interface]

  • 정적 라이브러리와 동적 라이브러리에 대해 정적 라이브러리는 포장과 같아서 필요한 모든 것을 exe에 넣고 하나의exe가 천하를 돌아다닌다.동적 라이브러리는 좌우에서 원본으로 실행될 때만 불러옵니다.내가 묘사한 것은 매우 전문적이지 않지만 후자는 매우 총명한 방법이지만 문제가 생기기 쉽다는 것을 알 수 있다.그러나 대부분의 프로그래머들이 유연한 방안을 좋아한다고 믿는다. DLL은 이렇게 유행하기 시작했다. 우리는 어떤 언어를 선택해서 DLL을 작성할 수 있다. 꼭 VC가 아니라 VB일 수도 있다.(마이크로소프트에만 속하는 언어가 이런 권리를 가진 것 같다) 그리고 이것도 고내적 결합과 저결합의 디자인 원칙에 부합된다.물론, 그것은 너의 절차가 매우 비대하지 않을 것을 보장할 것이다.(DLL이 없으면 Windows가 어떻게 될지 상상하기 어렵다).하나의 DLL을 여러 프로세스에서 공유할 수 있기 때문입니다.이상은 뚜렷한 우세입니다.
    DLL에서 일부 함수를 내보내려면 함수 앞에 다음을 추가해야 합니다.declspec(dllexport)의 내보내기 표시자입니다.책에서도dumpbin 명령의 사용이 소개되어 디버깅에 도움이 된다.
    DLL을 로드하는 방법은 다음과 같습니다.
  • 암시적 링크
  • 디스플레이 로드
  • 스텔스 링크의 실현서에 관해서는 정말 난잡하게 이야기했기 때문에 나는 정리해 보았다.일반적으로 우리는 스텔스 링크 방식으로 세 가지 물건을 필요로 한다.
  • dll
  • lib
  • 헤더 파일
  • #include "Dll1.h"
    
    #pragma comment(lib,"Dll1.lib")

    그리고 불러올 곳에 상기 코드를 쓰면 됩니다.이것은 스텔스 링크가 dll을 사용하는 일반적인 방식입니다.이런 dll는 어떻게 써야 합니까?
    우선 우리는 표지부호를 성명해야 한다:declspec(dllimport).이 물건이 비교적 문명한 방식은 상술한 머리 문서에 쓴 것이다.
    #ifdef DLL1_API
    
    #else
    
    #define  DLL1_API _declspec(dllimport)
    
    #endif

    그리고 내보내야 할 함수마다 DLL1API면 돼, 이 이름은 스스로 지은 거야.WINDOWS와 같이 여러 가지 강압이 있을 수 있습니다.API.이렇게 하면 우리는 cpp 파일에 다음과 같은 것만 추가할 수 있다.
    #define DLL1_API _declspec(dllexport)
    
    #include "Dll1.h"

    됐어요.이 물건은 낯익습니까?위에서 말한 내보내기 표시부호가 아닌가..
    마지막 책에서 중점적으로 설명한 문제, 즉 이름 개편 문제의 해결 방안.나는 마지막으로def 파일에 의존하는 방식이 비교적 적합하다고 생각한다.이 안에는 두 가지 함수가 있는데, 하나는 일반 함수이고, 다른 하나는 클래스 함수이다.클래스 함수에 대해 다음과 같은 특별한 배려를 해야 한다.
    LIBRARY Dll1
    
    
    
    EXPORTS
    
    add	@1
    
    subtract @2
    
    ?output@Point@@QAEXHH@Z @3
    
    ?test@Point@@QAEXXZ @4

    def 파일에 이 몇 마디를 넣으면 앞과 책이 똑같고 마지막 두 줄이 이렇게 추한 것은 클래스 함수이기 때문이다.다음에 이어지는 @1 같은 것은 사용자 정의 번호입니다.그 두 줄의 추악한 물건은 어떻게 얻었습니까?
    VC6에서 settings->Link,Generate mapfile을 표시합니다.컴파일한 후 debug 아래에 하나 있습니다.map 파일, 메모장으로 열고 다음과 같은 문장을 찾습니다.
     0001:00000030       ?add@@YAHHH@Z              10001030 f   Dll1.obj
    
     0001:00000060       ?subtract@@YAHHH@Z         10001060 f   Dll1.obj
    
     0001:00000090       ?output@Point@@QAEXHH@Z    10001090 f   Dll1.obj
    
     0001:00000180       ?test@Point@@QAEXXZ        10001180 f   Dll1.obj

    못생긴 게 어디서 났는지 알 수 있겠지!
    다음은 '동적 불러오기 방식' 이라고 하는 디스플레이 불러오기입니다.얘는 어디에 움직일까요?나는 그것이 가볍고 부르는 대로 오는 데 있다고 생각한다.가벼움은 어디에 있습니까?그것은 dll만 필요하고 다른 것은 모두 필요 없다.부르는 대로 오는 것은 필요할 때 dll를 불러오는 것입니다. 필요 없으면 닫을 수 있습니다.
    dll을 프로젝트 아래에 놓고 다음과 같은 코드를 써야 합니다.
    //     dll
    
    HINSTANCE hInst;
    
    hInst = LoadLibrary("Dll3.dll");
    
    //         
    
    typedef int (*ADDPROC)(int a,int b);
    
    //   dll    
    
    /*ADDPROC Add = (ADDPROC)GetProcAddress(hInst,"?add@@YAHHH@Z");*/
    
    ADDPROC Add = (ADDPROC)GetProcAddress(hInst,MAKEINTRESOURCE(1));
    
    if (!Add)
    
    {
    
    	MessageBox("        !");
    
    	return;
    
    }

    두 가지 함수를 주의해야 한다. 그것이 바로 LoadLibrary(LPCTSTR)이다.및 GetProAddress(HMODULE, LPCSTR);전자는 dll을 가져오고, 후자는 도출 함수를 가져옵니다.매개 변수 1은 전자의 반환값이고, 매개 변수 2는 두 가지 방안이 있다. 주석하는 것은 일반적인 방법으로 함수 이름을 얻는 것이다.여기서 선택한 함수 이름과 위의 추악한 것은 하나의 것임을 알 수 있다. OK. 이것이 바로 함수 이름이다.일치를 유지해야 한다.또한 함수의 번호가 위에서 말한 @1이라는 글자를 알면 MAKEINTRESOURCE 매크로로 변환할 수 있습니다.
    이 dll을 더 이상 사용하지 않으면 dll을 풀어야 합니다.다음과 같습니다.
    FreeLibrary(hInst);

    자, 동적 불러오는 것은 사실 이렇게 많은 내용인데, 사실은 스텔스 링크와 통하는 점이 많다.만약 프로그램에서 dll을 대량으로 사용한다면, 스텔스 링크가 한꺼번에 이루어지는 방안이 당신에게 비교적 적합하지만, 간혹 사용하기만 한다면 (예를 들어 내가 VC6에서 CImage 종류를 사용하고 싶을 때 2008년에 VC6 호출을 위한 dll를 만들었을 때), 디스플레이를 불러오는 것을 추천합니다.
    어떻게 선택하느냐는 너의 실제 상황에 달려 있다. 영원히 상하문 프로그래밍에서 벗어나지 마라!
    MFC DLL에 대한 내용은 잠깐 보았을 뿐입니다. 어쨌든 MFC라는 오래된 물건은 훗날 반드시 우리를 떠나게 될 것입니다.

    좋은 웹페이지 즐겨찾기