EXE가 LoadLibrary를 여러 번 하면 어떻게 되는지.
1898 단어 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
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
VB에서 VC로 작성된 DLL을 호출하는 방법 공유이 두 가지가 있으면 VC를 사용하는 수조처럼 처리할 수 있습니다.도면을 내보내는 경우 WMF 또는 BMP 형식을 생성하여 VB를 호출할 수 있습니다.그러나 나는 VB가 창의 핸들 hWnd와 hDC, 그리고 창의 그...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.