VC++ MFC 정적 및 동적 dll
DLL은 Dynamic Link Library(Dynamic Link Library)를 의미하며 여러 응용 프로그램(심지어 서로 다른 언어로 작성된 응용 프로그램)에서 동시에 호출될 수 있는 실행 가능한 바이너리 파일로 공유 가능한 라이브러리입니다.DLL은 고객/서버 통신의 개념에 따라 몇 가지 함수, 클래스 또는 자원을 포함하는 라이브러리 파일로 함수와 데이터는 하나의 DLL(서버)에 저장되고 한 개 이상의 고객이 내보내서 사용한다. 이런 고객은 응용 프로그램이나 다른 DLL일 수 있다.
다음에 우리는 구체적인 예를 통해 VC를 어떻게 활용하는지 설명할 것이다.Net에서 DLL 파일을 정의하고 VC.Net의 응용 프로그램에서 호출됩니다. 이 예의 주요 기능은 DLL을 통해 시스템의 기계 이름, 운영체제 유형, IP 주소를 가져오는 것입니다.
VC에서.Net에서 DLL 파일 정의
VC를 선택합니다.Net 메뉴 항목, 파일 -> 새로 만들기 -> 항목을 선택하고, 팝업된 새 항목의 대화상자에서 항목 유형이 Visual C++ 항목, 종류가 MFC인 프로젝트를 선택하고, 오른쪽에 있는 템플릿에서 MFC DLL 템플릿을 선택하여 프로젝트의 이름을 TestDLL로 정하고, 항목의 위치를 선택하고, 확인건에 따라 응용 프로그램 설정에 들어갑니다.
응용 프로그램 설정에서 볼 수 있듯이 세 가지 DLL 유형이 있는데 그것이 세 가지 DLL에 순차적으로 대응하는 것이다.
정적 DLL과 공유 DLL의 차이점은 전자는 MFC의 정적 링크 라이브러리를 사용하고 생성된 DLL 파일의 길이가 크다. 일반적으로 이런 방식을 사용하지 않는다. 후자는 MFC의 동적 링크 라이브러리를 사용하고 생성된 DLL 파일의 길이가 작다.MFC에 동적으로 연결된 공유 DLL의 모든 출력 함수는 다음과 같은 문구로 시작해야 한다(MFC 모듈 상태를 정확하게 전환하는 데 사용):AFXMANAGE_STATE(AfxGetStaticModuleState() 확장 DLL은 MFC의 파생 클래스를 만드는 데 사용되며, MFC 클래스 라이브러리로 작성된 프로그램에서만 호출됩니다.일반적인 DLL(정적과 동적 포함)의 특징 중 하나는 원본 파일에 CWinApp을 계승하는 클래스가 있다는 것이다(CWinApp에서 파생되었지만 메시지 순환이 없다). 내보낸 함수는 C++ 클래스나 C++ 구성원 함수이다. 일반적인 DLL을 호출하는 응용 프로그램이 반드시 MFC 응용 프로그램이 될 필요는 없다.확장 DLL은 일반적인 DLL과 달리 CWinApp에서 계승된 클래스의 대상이 없고 컴파일러는 DLL 입구 함수인 DLLMain()을 DLL의 초기화로 기본값으로 한다.또한 두 가지 추가 기능을 추가할 수 있습니다: 자동화와 윈도우즈 플러그인입니다. 만약 이 두 가지를 선택한다면 프로그램은 초기화를 할 것입니다. 여기서 우리는 토론을 하지 않겠습니다.이 예에서는 "공유된 MFC DLL 사용"을 선택합니다.코드 추가: 1. 프로젝트에서 시스템 info를 가져옵니다.cpp 및 시스템 info.h 파일, 이 두 파일은 본 컴퓨터의 기계 이름, 운영체제 버전과 본 컴퓨터의 IP 목록을 가져오는 데 사용되며, 구체적인 정의는 원본 파일을 참조하십시오.TestDLL.h헤드 파일에 시스템Info 도입h헤드 파일 #include systemInfo.h 변수 추가: CSystemInfo mSystemInfo;2. CtestDLLApp 클래스에 세 가지 함수 사용자를 추가하여 정보를 얻습니다.
//
char* GetHostName(void);
//
char* GetSystemType(void);
//IP
void GetIPAddressList(char ** lpIPList,DWORD *lpNumber);
:
//
char* CTestDLLApp::GetHostName(void)
{ char* lpsz = new char[1024];
m_SystemInfo.GetHostName(lpsz);
return lpsz;
} //
char* CTestDLLApp::GetSystemType(void)
{ char* lpsz = new char[1024];
m_SystemInfo.GetlSystemType(lpsz);
return lpsz;
} //IP
void CTestDLLApp::GetIPAddressList(char ** lpIPList,DWORD *lpNumber)
{ m_SystemInfo.GetIPAddressList(lpIPList,lpNumber);
}
3、 :
TestDLL “TestDLL.cpp” , :
// CTestDLLApp
CTestDLLApp theApp;
DLL , :
/******************* ***************************/
/********************************************
:GetHostName
:
:strHostName-
*********************************************/
extern "C" _declspec(dllexport) void GetHostName(LPTSTR strHostName )
{ // strcpy , 。
strcpy(strHostName,theApp.GetHostName());
} /********************************************
:GetSystemType
:
:strSystemType-
*********************************************/
extern "C" _declspec(dllexport) void GetSystemType(char * strSystemType)
{ strcpy(strSystemType,theApp.GetSystemType());
} /********************************************
:GetIPAddressList
: IP
:lpIPList- IP ,lpNumber IP
*********************************************/
extern "C" _declspec(dllexport) void GetIPAddressList(char ** lpIPList,DWORD *lpNumber)
{ theApp.GetIPAddressList(lpIPList,lpNumber);
}
마지막으로 프로젝트 파일을 컴파일하여TestDLL을 생성합니다.dll 파일.
이제 DLL 파일 하나가 완성되었습니다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
집 서버 설계 (하드웨어 편)자신의 Redmine이나 ownCloud를 운용하기 위해 사쿠라 VPS, DigitalOcean, OpenShift 등을 놀랐습니다만, 침착 해 왔으므로 현상을 정리하고 싶습니다. 먼저 하드웨어 구성을 정리합니다. ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.