다음을 통해 공유


MFCATL 샘플: MFC 서버에서 ATL COM 개체 사용

업데이트: 2007년 11월

MFCATL 샘플은 ATL COM 개체를 MFC 서버 EXE에서 사용하는 방법을 보여 줍니다.

이 서버는 두 개체, 즉 MFC로 구현되고 dispinterface를 지원하는 ObjectOne과 ATL로 구현되고 이중 인터페이스를 지원하는 ObjectTwo의 생성을 허용합니다.

보안 정보:

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

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

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

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

  • 최신 버전 및 전체 샘플 목록은 Visual Studio 2008 Samples 페이지에서 온라인으로 사용할 수 있습니다.

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

샘플 빌드 및 실행

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

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

  2. 빌드 메뉴에서 솔루션 빌드를 클릭합니다.

  3. 디버그 메뉴에서 디버깅하지 않고 시작을 클릭합니다. 그러면 mfcatl.exe 서버가 독립 실행형으로 실행되고 등록됩니다.

  4. 웹 브라우저에서 mfcatl.htm 파일을 열고 단추를 클릭하여 해당 개체를 호출합니다. 각 개체를 개별적으로 호출하거나 동시에 모두 호출할 수 있습니다.

변환 주의 사항

원래 두 MFCATL 개체는 MFC에서 구현되었고 CCmdTarget에서 파생되었습니다. ObjectTwo는 다음 단계에 따라 ATL을 사용하여 다시 구현했습니다.

  1. ATL 헤더 파일(Atlbase.h 및 Atlcom.h)을 Premfcat.h에 포함합니다.

  2. Atlimpl.cpp를 Premfcat.cpp에 포함합니다.

  3. CComModule 파생 클래스를 Prefcat.h에 추가합니다(BEEPER EXE 샘플과 유사). 이 파생 클래스는 AfxOleLockAppAfxOleUnlockApp를 호출하여 MFC에 잠금 횟수를 전달하기 위해 Lock 및 Unlock 메서드를 구현합니다.

  4. Mfcatl.cpp에 개체 맵 매크로 쌍(BEGIN_OBJECT_MAP/END_OBJECT_MAP)을 추가하고 _Module이라는 모듈 클래스의 정적 인스턴스를 추가합니다.

  5. InitInstanceExitInstance에서 _Module.InitTerm을 호출합니다.

  6. typelib를 리소스로 추가합니다.

  7. InitInstance에서 **_Module.RegisterServer(TRUE)**를 호출하여 MFC 호출을 COleObjectFactory::UpdateRegistryAll에 일치시킵니다.

  8. _Module.RegisterClassObjects(CLSCTX_LOCAL_SERVER, **REGCLS_MULTIPLEUSE)**를 호출하여 IMPLEMENT_OLECREATE 매크로에 의해 암시적으로 수행되는 것처럼 MFC 클래스 팩터리의 REGCLS_MULTIPLEUSE를 일치시킵니다.

  9. 다음 세 단계에 따라 ATL에서 ObjectTwo를 다시 구현합니다.

    • ODL 파일을 dispinterface에서 이중 인터페이스로 변경합니다.

    • ODL 컴파일이 ATL에 필요한 헤더 파일(Interf.h)을 생성하게 합니다.

    • .h 및 .cpp 파일을 다시 작성합니다. 가장 빠른 방법은 ATL 마법사를 실행하고 원래 MFC 코드 대신 자동으로 생성된 코드를 복사하여 붙여넣은 다음 이름을 바꾸는 것입니다.

    • **OBJECT_ENTRY(CLSID_ObjectTwo, CObjectTwo)**를 ATL 개체 맵에 추가합니다.

여기에서 다루지 않는 추가 변환 단계는 다음과 같습니다.

  • ODL 파일을 IDL 형식으로 이식

  • -RegServer-UnregServer 명령줄 인수에 대한 지원 추가

키워드

이 샘플에서는 다음의 키워드를 사용합니다.

AfxMessageBox; AfxOleInit; AfxOleLockApp; AfxOleUnlockApp; ASSERT; BEGIN_COM_MAP; CCmdTarget; CCmdTarget::OnFinalRelease; CComCoClass; CComModule; CComModule::GetLockCount; CComModule::Lock; CComModule::Unlock; CComObjectRoot; CDialog; CMenu::AppendMenu; COleObjectFactory::RegisterAll; COleObjectFactory::UpdateRegistryAll; COM_INTERFACE_ENTRY; CString::IsEmpty; CString::LoadString; CWindow::GetSystemMenu; DECLARE_DYNCREATE; DECLARE_NOT_AGGREGATABLE; DECLARE_REGISTRY; DestroyWindow; EnableAutomation; GetClientRect; GetSystemMetrics; IDispatchImpl; PostMessage; SendMessage; SetIcon; ShowWindow; SysAllocString

참고 항목

기타 리소스

ATL 샘플