4가지 DLL: NON-MFC DLL, Regular DLL Statically/Dynamically Linked to MFC, MFC Extension DLL
https://msdn.microsoft.com/en-us/library/30c674tx.aspx
http://www.cnblogs.com/qrlozte/p/4844429.html
http://www.cnblogs.com/qrlozte/p/4850642.html
위에서 설명한 MSDN 링크에서는 네 가지 DLL의 정의를 볼 수 있습니다.여기에는 군말하지 않겠다.주워 말하다
차이점은 다음과 같습니다.
1. VS에서 네 가지 DLL 프로젝트를 만드는 방법
1.1、NON-MFC DLL
새 항목 > VC++ > Win32 > Win32 항목 > DLL 선택
1.2、Regular DLL Statically/Dynamically linked to MFC
새 프로젝트 > VC++ > MFC > MFC DLL > Statically linked to MFC/Dynamically linked to MFC 선택
1.3、MFC Extension DLL
새 항목 > VC++ > MFC > MFC DLL > MFC Extension DLL 선택
DLLDEMO 프로젝트:
예를 들어 NON-MFC DLL(AddXx.dll): C 함수, 전역 변수, 비 MFC의 C++ 클래스를 내보냅니다.
예를 들어 Regular DLL Dynamically linked to MFC(Add.dll): C 함수를 내보냈습니다. 이것은 MFC가 아닌 C++ 클래스입니다. 둘 다 그 내부에서 MFC를 사용하여 대화상자를 만들 수 있습니다.또한 InfoDlgFactory를 통해 Regular DLL이 MFC 클래스를 내보내지 못하는 이유를 설명했습니다.InfoDlg 만나요.cpp의 InfoDlgFactory 주석
예를 들어 MFC Extension DLL(AddExt.dll): 대화상자인 C 함수, MFC 하위 클래스를 내보냅니다.
테스트 프로그램:FontView.exe, Print Sample 단추를 누르면 세 가지 DLL을 테스트할 수 있습니다. 관련 코드는 CMain Window::OnPush Button Clicked에서 볼 수 있습니다.
다운로드 주소: DLDEMO 다운로드
참고:
1、AFX_MANAGE_STATE의 역할
https://msdn.microsoft.com/en-us/library/0asx94f7.aspx
https://msdn.microsoft.com/en-us/library/30c674tx.aspx
간단하게 말하자면 당신의 프로젝트에 a.EXE, b.DLL, c.DLL, a는 b, b는 c로 동적 연결이 있다고 가정하면 실제로 a, b, c는 세 개의 모듈이다.코드 실행 경로(code path)가 a에서 b로 또는 b에서 c로 전환될 때'모듈 상태'의 전환이 관련된다. 물론 이'모듈 상태'는 쪼개서 깨물어야 한다. 말하면 전날도 다 말한 것은 아니다. 어쨌든AFXMANAGE_스테이트가 이 일을 한 거야.만약 그것이 없다면 각종 오류가 발생할 것이다.
AddExt 작성dll 코드를 볼 때 MSDN의 설명을 자세히 보지 않았기 때문에 InfoDlgFactoryExt에서 AFX 를 사용했습니다MANAGE_STATE로 인해 LNK2005 오류가 발생했습니다(error LNK2005:DllMain@12 already defined in dllmain.obj).실제로 MFC Extension DLL은 이걸 쓰지 않아요,AFXMANAGE_STATE는 MFC에 동적으로 연결된 Regular DLL에 대해서만 사용할 수 있습니다(https://msdn.microsoft.com/en-us/library/30c674tx.aspx;“The AFX_MANAGE_STATE macro should not be used in regular DLLs that statically link to MFC or in extension DLLs. ”).
2、AFX를 사용해야 하는 곳MANAGE_STATE
사전 요구 사항, DLL은 MFC 라이브러리에 동적으로 연결되는 regular dll입니다.그리고 모듈 전환과 관련된 부분, 즉 하나의 모듈 호출이 다른 모듈 내의 코드를 실현하고 이 코드가 MFC 라이브러리의 코드를 호출할 때이다.AFX 를 사용해야 합니다MANAGE_STATE.아래는 예를 들어 설명한다
Add 프로젝트를 열고CinfoDlg와 DoModalDlgImpl의 정의를 보십시오
class CInfoDlg : public CDialog, public IInfoDlg
IInfoDlg의 정의를 보면 IInfoDlg는 순수한interface이고 그 안에는pure virtual 함수만 Add로 되어 있음을 알 수 있다.dll의 인터페이스용.CDialog는 MFC 클래스입니다.그래서 CinfoDlg도 MFC 클래스이기 때문에 CinfoDlg의 창설, 사용, 소각은 모두 MFC 라이브러리를 호출할 것이다.
따라서 IInfoDlg의 DoModalDlg와Release,InfoDlgFactory는 모두 MFC 라이브러리를 호출한다.그래서 이 세 가지 방법 다 AFX를 사용했어요.MANAGE_STATE
class DoModalDlgImpl : public IDoModalDlg
IDoModalDlg도interface이기 때문에DoModalDlgImpl은 일반적인 C++류일 뿐입니다.MFC 라이브러리의 생성, 사용 및 제거가 호출될지 여부는 MFC 라이브러리의 구현에 따라 달라집니다.
이제 DoModal DlgImpl의 실현을 보러 가자.
Domodal Dlg Impl::Domodal Dlg에만 CinfoDlg가 만들어지고 CinfoDlg::Domodal이 호출되었기 때문에 Domodal Dlg Impl::Domodal Dlg만 MFC 라이브러리를 호출할 수 있습니다.
따라서 DoModalDlgImpl과 관련된 DoModalDlg,Release,DoModalDlgFactory를 볼 수 있다. DoModalDlg만 AFX 를 사용해야 한다.MANAGE_STATE.
3. DLL의 C++ 클래스나 MFC 클래스를 직접 export하지 않는 이유
http://www.codeproject.com/Articles/28969/HowTo-Export-C-classes-from-a-DLL
하나의 C++ 클래스(MFC 클래스도 예외가 아니다)는 두 가지 부분을 포함하는데 인터페이스와implementation, 즉 인터페이스와 실현,public와protected의 부분은interface(protected 부분은 하위 클래스만interface)에 속한다.
"What you see is not what you get"
실제 DLL의 클래스를 내보냅니다. 그 목적은 인터페이스를 내보내는 것이지, 실현하는 것이 아닙니다.단, 직접declspec(dllexport)에서 C++ 클래스를 내보내면 인터페이스 부분을 내보낼 뿐만 아니라 그 실현 부분도 내보냅니다. 그래서 하나의 클래스의 실현이 다른 클래스(예를 들어 계승을 통해 또는 구성원을 통해)에 사용된다고 가정하면 이 부분도 내보냅니다. 이 과정은 계속 진행될 것입니다. 그래서 세 가지 방법만 내보내려고 했는데 그 결과 내보내고 싶지 않은 것이 만8천 개가 나왔습니다.
이것이 바로 DLLDEMO에서 인터페이스 부분에 모두의interface(pure virtual 함수만 있는 C++ 클래스)를 사용하는 이유입니다. 이렇게 하면 이 문제를 해결할 수 있습니다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.