Win32의 동적 라이브러리 로드

3314 단어
얼마 전에 코드를 썼는데, 메인 프로세스에서 많은 dll를 불러올 것입니다. 처음에 쓴 dll 동적 불러오는 것은 매우 번거롭습니다.맏형은 정적 캐리어로 썼는데 뜻을 잘못 이해하고 정적 라이브러리로 바꿨대요. 정말 바보예요.오랫동안 동적 라이브러리를 쓰지 않아서 잊어버린 것이 많지 않아 노트에도 간단하게 적어 놓았다.마지막으로 dll 정적 불러오기로 바꿨습니다. 이제 총괄해 봅시다.
동적 라이브러리, Windows에서는 dll 파일, Linux에서는 so, 여기서는 토론하지 않습니다.dll 파일은 파일을 실행할 수 있는 일종이자 PE 파일이다. 그리고 흔히 볼 수 있는 PE 파일 형식은 exe 파일, 즉 Windows 프로그램이다.동적 라이브러리는 단독으로 실행할 수 없습니다. 특정한 프로세스에 불러와야 합니다. 동적 라이브러리의 불러오는 것은 정적 불러오기와 동적 불러오기로 나눌 수 있습니다.프로그램에서 동적 라이브러리를 불러오는 것을 불러오는 것이라고 하고, 다른 프로그램에 동적 라이브러리를 불러오는 것을 주입이라고 하며, 이 뒤에 다시 쓴다.
1. 동적 로드
1)_declspec(dllexport)
동적 불러오기도 실행할 때 불러옵니다. 프로그램이 불러오는 문장까지 실행할 때 동적 라이브러리를 불러옵니다. 동적 불러오기는api 인터페이스 LoadLibrary를 호출합니다.
HMODULE LoadLibraryA(
  LPCSTR lpLibFileName
);

인터페이스가 동적 라이브러리 핸들을 되돌려주고 GetProcAddress를 호출하여 함수 주소를 내보냅니다. 동적 라이브러리를 불러오는 목적은 동적 라이브러리의 인터페이스를 호출하는 것입니다.
FARPROC GetProcAddress(
  HMODULE hModule,
  LPCSTR  lpProcName
);

함수 주소를 되돌려줍니다. 다시 시작하기 전에 typedef를 사용하여 함수 형식을 정의해야 합니다. 함수를 내보내는 바늘을 가리킵니다.함수 반환 값은 인삼과 내보내기 함수와 같습니다.이어서 정의된 함수를 호출하는 방식으로 내보내는 함수를 호출할 수 있다.
마지막으로 FreeLibrary를 사용하여 모듈 핸들을 놓습니다.
BOOL FreeLibrary(
  HMODULE hLibModule
);

동적 라이브러리에서 내보낼 함수 앞에
extern "C"
_declspec(dllexport)

상술한 동적 불러오는 과정은 dll 파일만 제공하면 됩니다.
2) def 파일
아래 정적 로드된 def 파일의 내용과 같고, 사용 시 LoadLibrary 인터페이스를 호출합니다. 제공해야 합니다.h 헤더 파일.
 
2. 정적 로드
정적 불러오는 것은 함수를 컴파일할 때 모듈 코드를 프로그램에 불러오는 것이다.정적 로드에도 두 가지 방법이 있는데, 하나는 def 파일이고, 다른 하나는declspec(dllexport)
1) def 파일
def 파일의 형식은 다음과 같습니다.
LIBRARY MoudleName
EXPORTS 
    Function1 @1
    Function2 @2
    ...

사용할 때 파일 헤더에 다음 문장을 추가하려면 헤더 파일,lib 파일, dll 파일을 제공해야 합니다
#pragma comment(lib,"DllName.lib") 

 
2)_declspec(dllexport)
동적 라이브러리의 내보내기 함수 앞에 더하기
extern "C"
_declspec(dllexport)

사용 시 파일 앞에 더하기
#include "DllName.h"

#pragma comment(lib,"DllName.lib")

extern "C"
_declspec(dllexport) Function()

이 마운트 방식은 헤더 파일,lib 파일, dll 파일을 제공해야 합니다.
lib 파일은 동적 라이브러리의 가져오기 라이브러리로 프로그램 함수 주소 기호 등에 제공되며 정적 라이브러리가 아닙니다.
전재 대상:https://www.cnblogs.com/w1ng/p/10171582.html

좋은 웹페이지 즐겨찾기