다음을 통해 공유


DLLScreenCap 샘플: MFC에 정적 또는 동적으로 링크하는 기본 DLL

업데이트: 2007년 11월

DLLScreenCap 샘플에서는 스크린 캡처 도구의 DLL(동적 연결 라이브러리) 버전을 보여 줍니다. DLLScreenCap은 이전의 DLLTRACE 샘플을 대신합니다. DLLTRACE는 MFC 버전 1.0에서 MFC 라이브러리에 정적으로 링크된 DLL을 작성하는 방법을 보여 주기 위해 도입되었습니다. DLLScreenCap에서는 DLL이 동적으로 링크되는 Microsoft Windows 기반 응용 프로그램에 C 기반 프로그램 인터페이스를 제공합니다. MFC 라이브러리에 정적으로 링크된 DLL은 MFC 클래스에서 파생된 모든 클래스의 멤버 함수를 올바르게 내보낼 수 없습니다.

DLL을 MFC 라이브러리에 정적으로 링크시키는 기술에 대한 자세한 내용은 Technical Note 11: Using MFC as Part of a DLL을 참조하십시오. DLLScreenCap 샘플은 확장 DLL이 되지 않고도 MFC에 동적으로 링크될 수 있습니다. MFC에 정적으로 링크시켜 사용자 지정 DLL을 구현하려면, 먼저 DLL Version of MFC의 설명과 DLLHUSK 샘플에서 보여 주는 것처럼 DLL을 MFC 확장 DLL로 구현할 것을 고려하십시오.

MFC 라이브러리에 링크되는 비 확장 DLL에는 실행 가능한 MFC 응용 프로그램에서처럼 CWinApp 파생 클래스와 해당 응용 프로그램 클래스의 단일 개체가 있어야 합니다. 그러나 응용 프로그램의 CWinApp 개체와 달리 DLL의 CWinApp 개체에는 기본 메시지 펌프가 없습니다. DLL에서 모덜리스 대화 상자를 열거나 자체의 기본 프레임 창을 갖는 경우, 응용 프로그램의 기본 메시지 펌프는 DLL에서 내보내는 루틴을 호출해야 합니다. 그러면 이 루틴이 DLL의 응용 프로그램 개체에 대한 CWinApp::PreTranslateMessage 멤버 함수를 호출하게 됩니다. 이는 DLLScreenCap.dll에 의해 내보내지는 FilterDllMsg 함수에서 보여 줍니다.

ScreenCapApi.h에서는 DLL 인터페이스를 클라이언트 응용 프로그램에 제공하는 방법이 함수를 extern "C"로 선언하는 것임을 보여 줍니다. extern "C"를 사용하는 데는 몇 가지 장점이 있습니다. 먼저, 사용자의 DLL을 비 C++ 클라이언트 응용 프로그램에서 사용할 수 있도록 만듭니다. 둘째, 내보내지는 이름에 C++ 이름 데코레이션이 적용되지 않으므로 DLL 오버헤드가 줄어듭니다. 셋째, C++ 이름 데코레이션에 신경 쓰지 않고도 서수로 내보내기 위해 .def 파일에 명시적으로 추가하기가 더 쉽습니다.

보안 정보:

이 샘플 코드는 개념을 보여 주기 위해 제공되며 가장 안전한 코드 작성 방법을 제시하지 않을 수 있으므로 응용 프로그램이나 웹 사이트에서 사용할 수 없습니다. Microsoft는 샘플 코드를 원래 용도 이외의 다른 용도로 사용하는 경우 발생하는 부수적이나 파생적인 손해에 대해 책임을 지지 않습니다.

샘플 및 이를 설치하기 위한 지침을 가져오려면

  • Visual Studio의 도움말 메뉴에서 샘플을 클릭합니다.

    자세한 내용은 샘플 파일 찾기를 참조하십시오.

  • The most recent version and complete list of samples is available online from the Visual Studio 2008 Samples page.

  • 컴퓨터의 하드 디스크에서도 샘플을 찾을 수 있습니다. 기본적으로 샘플과 추가 정보 파일은 \Program Files\Visual Studio 9.0\Samples\ 아래의 폴더에 복사됩니다. Visual Studio Express Edition의 경우에는 모든 샘플이 온라인에 있습니다.

샘플 빌드 및 실행

DLLScreenCap 샘플은 DLL 프로젝트인 DLLScreenCap과 DLL을 호출하는 EXE 프로젝트인 ScreenCap으로 구성되어 있습니다.

제공된 솔루션에서 ScreenCap을 빌드하면 DLLScreenCap이 자동으로 빌드되고 해당 DLL은 ScreenCap의 출력 디렉터리로 복사됩니다.

참고 이 샘플은 사용자 지정 빌드 단계를 사용하여 파일을 복사하므로, UNC 경로로 솔루션을 열지 않아야 하며 샘플 파일을 드라이브 문자가 있는 디렉터리에 저장해야 합니다.

DLLScreenCap 샘플을 빌드하고 실행하려면

  1. 솔루션 파일인 DllScreenCap.sln을 엽니다.

  2. 솔루션 탐색기에서 ScreenCap 프로젝트 폴더를 마우스 오른쪽 단추로 클릭한 다음 바로 가기 메뉴에서 시작 프로젝트로 설정을 클릭합니다.

  3. 빌드 메뉴에서 빌드를 클릭합니다.

  4. 디버그 메뉴에서 디버깅하지 않고 시작을 클릭합니다.

ScreenCap 창에는 해당 창 크기로 크기를 조정한 후 마지막으로 캡처한 화면이 표시됩니다. File 메뉴에서 Configure Screen Capture를 클릭합니다. 이렇게 하면 화면 또는 활성 창의 캡처 여부와 캡처된 파일이 저장되는 경로를 지정하는 대화 상자가 열립니다. 캡처된 파일을 만들고 클라이언트 창 디스플레이를 업데이트하려면 Screen Capture를 클릭합니다.

MFC DLL과 동적으로 링크되도록 DLLScreenCap 변환

DLLScreenCap에서는 모달 대화 상자를 표시하기 위해 호출될 수 있는 내보내진 함수를 사용하여 기본 DLL을 만드는 방법을 보여 줍니다. 이전 버전의 Visual C++에서는 이 옵션이 기본 DLL에서 사용할 수 있는 유일한 옵션이었습니다. 이러한 종류의 DLL을 이전에는 _USRDLL이라고 했습니다.

이제는 기본 DLL이 공유 MFCx0 DLL에서 MFC를 사용할 수 있습니다. 빌드 크기가 줄어들 가능성이 있기 때문에 공유 MFC DLL을 사용하여 DLLScreenCap 샘플을 빌드하려는 경우도 있습니다. DLLScreenCap.dll에서 공유 라이브러리를 지원하면 릴리스 빌드 DLL의 크기가 100K에서 약 16K까지 줄어들고 디버그 빌드의 크기는 1MB에서 100K까지 줄어듭니다. DLLScreenCap에서 동적 링크를 지원하려면 AFX_MANAGE_STATE 매크로를 사용하여 전역 MFC 모듈 상태를 올바르게 전환합니다.

DLLScreenCap을 공유 라이브러리에서 사용할 수 있는지 확인하려면

  1. 솔루션 탐색기에서 ScreenCap 프로젝트 노드를 마우스 오른쪽 단추로 클릭한 다음 바로 가기 메뉴에서 속성을 클릭합니다.

    속성 페이지 대화 상자가 나타납니다.

  2. 구성 드롭다운 메뉴에서 여러 구성을 선택합니다. 속성 페이지 대화 상자에 대한 자세한 내용은 Visual C++ 프로젝트 속성 설정을 참조하십시오.

  3. 릴리스 빌드와 디버그 빌드를 모두 선택하여 설정을 변경합니다.

  4. 프로젝트의 일반 속성 페이지에서, 공유 DLL에서 MFC를 사용하는 속성인 MFC 사용 속성이 선택되어 있는지 확인합니다.

  5. DLL에서 내보내진 모든 함수의 처음 부분에 다음 코드가 있는지 확인합니다(자세한 내용은 MFC 모듈의 상태 데이터 관리 참조).

    AFX_MANAGE_STATE(AfxGetStaticModuleState())
    

예를 들어, DllScreenCap.dll에서는 다음 네 개의 함수를 내보냅니다.

  • CaptureScreen

  • ConfigureCapture

  • ProcessDLLIdle

  • FilterDLLMsg

FilterDLLMsg는 변환된 형식에서 다음과 같아야 합니다.

BOOL WINAPI FilterDllMsg(LPMSG lpMsg)
{
   AFX_MANAGE_STATE(AfxGetStaticModuleState())
   TRY
   {
       return AfxGetApp()->PreTranslateMessage(lpMsg);
   }
   END_TRY
return FALSE;
}

키워드

이 샘플에서는 다음의 키워드를 보여 줍니다.

CDialog::DoModal, CWinApp::InitInstance, CWinApp::OnIdle, CWinApp::PreTranslateMessage, CWnd::DoDataExchange, CWnd::GetClientRect, CWnd::OnPaint, ShowWindow, UpdateWindow, CImage, AFX_MANAGE_STATE, AfxGetStaticModuleState, CWnd::GetDesktopWindow, CWnd::GetActiveWindow, CImage::Create, CImageDC, CImage::Save, SHBrowseForFolder, CImage::Load, CDC::SetStretchBltMode, CImage::StretchBlt, CWnd::OnEraseBkgnd, CWindowDC

참고 항목

기타 리소스

MFC 샘플