Windows에서 동적 링크 라이브러리와 정적 링크 라이브러리 구축

5893 단어 Windows

DLL 포털 함수 작성

BOOL WINAPI DllMain(HANDLE hDllHandle,DWORD dwReason,  )
{
   HMODULE hModule=(HMODULE)hDllHandle;//             
   switch(dwReason)
   {
        case DLL_PROCESSS_ATTACH;//    
            //   
        case DLL_PROCESSS_DETACH;//    
            //    
        case DLL_THREAD_ATTACH;

        case DLL_THREAD_DETACH;
   }
}

프로그램이 dll을 마운트 해제하려고 할 때, 시스템은 dll 라이브러리의 DllMain 함수를 호출한 다음 실제 기능 함수를 작성합니다

함수 내보내기


def 파일 사용

  • VS 설정
    속성-링크기-입력-모듈 정의 파일-입력 def 파일
  • def 파일 문법
  • LIBIARY WIN32_DLL ... 

    함수 식별자 사용


    함수 앞의 한 마디에서 다음과 같이 이 함수 내보내기__declspec(dllexport) int fun1()를 나타낸다. 이렇게 내보내는 함수 이름은 VS로 수식되고 MS가 아닌 컴파일러는 함수를 정확하게 식별할 수 없다. extern'C'를 추가하면 함수 이름이 자신이 입력한 이름extern "C" __declspec(dllexport) int fun1()이다.

    DLL 사용


    동적 링크 라이브러리를 생성할 때 두 개의 파일 dll 파일을 생성합니다: 1.코드와 자원lib 파일을 저장합니다: (정적 링크 라이브러리가 아닙니다) 1.사용하는 동적 링크 라이브러리의 파일 이름은 무엇입니까?dll 파일에서 지정한 함수의 오프셋 주소 저장

    암시적 로드

  • 함수 가져오기 및 설명
  • #include 
    extern "C" __declspec(dllimport) int fun1()
    #pragma comment(lib,"WIN32_DLL.lib") 
  • 헤드 파일로 헤드 파일을 작성하여 WIN32DLL.h
  • #include 
    #ifdef _MYWIN32DLLTEST
    extern "C" __declspec(dllexport) int fun1();
    #else
    extern "C" __declspec(dllimport) int fun1();
    #pragma comment(lib,"WIN32_DLL.lib") ;
    #endif
    #undef _MYWIN32DLLTEST

    그리고 WIN32에서...DLL.cpp는 지정한 매크로를 인용하고 정의하며 호출 파일에서 인용하면 됩니다

    명시적 호출, 동적 로드


    dll만 있을 때, 이렇게 할 수 있지만, 어떤 방법을 통해 dll의 함수 정보, 예를 들어 어셈블리 등을 얻어야 한다
    #incluce 
    typedef int(*lpFUN1)(int,int);//        
    
    int main()
    {
        lpFUN1 fun1;
        HMODULE hDll;
        hDll=LoadLibrary(L"WIN32_DLL.dll");//  dll,  dll     
        if(hDll)
        {
            fun1=(lpFUN!)GetProcAddress(hDll,"FUN1");//      ,       
        }
    
        FreeLiberary(hDll);//            
    }

    클래스 내보내기 및 사용


    내보내기 함수와 유사하게 클래스 이름 앞에declspec(dllexport)면 됩니다class __declspec(dllexport) MyClass호출하기 편리하도록, 클래스의 헤더 파일은 이렇게 쓸 수 있다
    #include 
    #ifdef _MYWIN32DLLTEST
    #define MY_DLL_API __declspec(dllexport)
    extern "C" __declspec(dllexport) int fun1();
    #else
    #define MY_DLL_API __declspec(dllexport)
    extern "C" __declspec(dllimport) int fun1();
    #pragma comment(lib,"WIN32_DLL.lib") ;
    #endif
    #undef _MYWIN32DLLTEST
    
    class MY_DLL_API MyClass
    {
        //      
    };

    자원 내보내기 및 사용


    우리는 자원을 DLL에 넣고 DLL의 어떤 함수를 호출해서 지정한 자원을 얻을 수 있다
    hBitmap=(HBITMAP)LoadImage(MyModule(),MAKEINTRESOURCE(103),IMAGE_BITMAP,0,0,LR_COPYFROMRESOURCR);
    HRSRC hsrc; HGLOBAL hExe; LPVOID lpBuf; DWORD dwSize; DWORD dwWritten;
    //자원 핸들 hsrc=Find Resourse(MyModule(), MAKEINTRESOURCE(104), L"EXE")를 찾습니다.//리소스를 로드하고 리소스 주소 hExe=LaodResourse(MyModule(), hsrc)를 얻습니다.//hExe는 lpBuf 값과 같습니다. 이 문장은 이 자원이 정상적으로 잠겨 있는지 확인하는 데 사용됩니다.lpBuf=LoakResource(hExe); //자원 크기 dwSize=SizeofResource(MyModule(), hsec) 가져오기//그리고 자원에 대한 조작을 할 수 있습니다.
    hFile=CreateFile(L”./a.exe”,FENERIC_ALL,FILE_SHARE_READ|FILE_SHARE_WRITE,0,CREATE_ALWAYS,0,0); SetFilePointer(hFile,0,0,FILE_BEGIN); WriteFile(hFile,lpBuf,dwSize,&dwWritten,0); CloseHandle(hFile);

    정적 링크 라이브러리의 구조와 사용


    동적 링크 라이브러리와 거의 같지만 DllMain 함수는 없습니다

    좋은 웹페이지 즐겨찾기