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 파일 사용
속성-링크기-입력-모듈 정의 파일-입력 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")
#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 함수는 없습니다
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
[WinIoT/라즈파이] VS2019로 만든 UWP의 sln을 라즈파이 3+WinIoTCore로 원격 디버깅을 할 수 없을 때의 대처2021년 1월 시점에서 라즈파이 3에 WindowsIoTCore를 넣고 VisualStudio2019에서 UWP 앱을 새로 만들고 디버깅하려고 했는데 잘 디버깅할 수 없었다. 구체적으로는, 「리모트 디버거에 접속할...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.