EXE가 LoadLibrary를 여러 번 하면 어떻게 되는지.

1898 단어 DLL
DLL 기사 목록
LoadLibrary는 처음 로드되는 경우에만 여러 번 실행되며 EXE 메모리에는 항상 저장됩니다.
FreeLibrary를 호출하지 않는 한 DLL은 항상 존재합니다.
뒤에 있는 LoadLibrary는 빈 작업과 같습니다.
구체적인 원리 참조: 프로세스 EXE, DLL을 메모리에 로드하는 과정https://blog.csdn.net/calmreason/article/details/84404293
CllDLL.cpp
#include "stdafx.h"
#include 
#include 
#include 
#include 
using namespace std;

void f()
{
	string str = "Win32DLL.dll";
	HMODULE libraryHandle = ::LoadLibrary(str.c_str());

	if (libraryHandle != NULL)
	{
		typedef int (WINAPI* EXECUTOR_FUNC)(void);
		typedef function Handler;

		EXECUTOR_FUNC function = (EXECUTOR_FUNC)GetProcAddress(libraryHandle, "fnWin32DLL");
		if (function)
		{
			cout << function() << endl;
		}
		else
		{
			cout << "can not find function " << endl;
		}
	}
	else
	{
		cout << "can not loadlibrary!" << endl;
	}
}

int main()
{
	f();
	f();
    return 0;
}


DLL.cpp
// Win32DLL.cpp :    DLL          。
//

#include "stdafx.h"
#include "Win32DLL.h"

#include 
#include 
using namespace std;

//            
WIN32DLL_API int nWin32DLL=0;


class A
{
public:
	A(const string& id = ""):m_id(id) { cout << "A("<

출력:
A (a in global) A (a in fnWin32DLL) ~ A (a in fnWin32DLL) 42 A (a in fnWin32DLL) ~ A (a in fnWin32DLL) 42 ~ A (a in global)는 아무 키나 눌러 계속합니다.
 
두 번의 LoadLibrary에서 하나의 글로벌 대상만 만들었고 EXE가 탈퇴할 때 이 글로벌 대상을 방출한 것을 알 수 있다.
추가 참조: DLL의 객체 구조 및 분석https://blog.csdn.net/calmreason/article/details/83957799

좋은 웹페이지 즐겨찾기