DCOM 샘플: COM 개체 원격 호출 설명
업데이트: 2007년 11월
DCOM 샘플은 다른 시스템에서 실행 중인 여러 클라이언트의 Windows 서비스에서 구현된 COM 개체를 호출하는 방법을 보여 줍니다. 이 샘플은 다음 세 개 부분으로 구성됩니다.
DrawServ — COM 개체를 구현하는 Windows 서비스입니다.
ATLDraw — DrawServ COM 개체에 연결되는 클라이언트입니다.
DrawCtl — ATLDraw의 컨트롤 버전입니다.
보안 정보: |
---|
이 샘플 코드는 개념을 보여 주기 위해 제공되며 가장 안전한 코드 작성 방법을 제시하지 않을 수 있으므로 응용 프로그램이나 웹 사이트에서 사용할 수 없습니다. Microsoft는 샘플 코드를 원래 용도 이외의 다른 용도로 사용하는 경우 발생하는 부수적이나 파생적인 손해에 대해 책임을 지지 않습니다. |
샘플 및 이를 설치하기 위한 지침을 가져오려면
Visual Studio의 도움말 메뉴에서 샘플을 클릭합니다.
자세한 내용은 샘플 파일 찾기를 참조하십시오.
최신 버전 및 전체 샘플 목록은 Visual Studio 2008 Samples 페이지에서 온라인으로 사용할 수 있습니다.
컴퓨터의 하드 디스크에서도 샘플을 찾을 수 있습니다. 기본적으로 샘플과 추가 정보 파일은 \Program Files\Visual Studio 9.0\Samples\ 아래의 폴더에 복사됩니다. Visual Studio Express Edition의 경우에는 모든 샘플이 온라인에 있습니다.
샘플 빌드 및 실행
이 샘플이 작동되려면 모든 컴퓨터에서 Windows 2000 이상을 실행해야 합니다.
이 샘플을 빌드하고 실행하려면
DCOM.sln 솔루션을 엽니다.
빌드 메뉴에서 솔루션 빌드를 클릭합니다.
DrawServ.exe 및 ATLDraw.exe 또는 DrawCtl.dll을 샘플을 실행할 각 컴퓨터에 복사합니다. 명령줄 인수 /RegServer 또는 -RegServer(대/소문자 구분 안 함)가 지정된 DrawServ를 실행하여 각 컴퓨터에 서버를 등록합니다. 예를 들면 다음과 같습니다.
C:\ATL> DrawServ /RegServer
이때 DrawServ를 제대로 실행하려면 ATL.DLL을 등록해야 합니다. 각 클라이언트에 서버에 대한 CLSID와 서버 유형 라이브러리를 등록하려면 서버를 각 클라이언트에 복사해야 합니다.
제어판의 서비스 아이콘을 사용하여 서버에서 서비스를 시작합니다.
각 클라이언트(명령줄에서 실행)에서 DCOMCNFG 유틸리티를 사용하려면 DrawServ 클래스의 해당 속성들을 선택합니다. 위치 탭에서 다음 컴퓨터에서 응용 프로그램 실행을 선택합니다. 서버 개체를 실행하고 있는 컴퓨터의 이름을 입력합니다.
ATLDraw를 실행하고 각 클라이언트에 있는 메뉴에서 서버 연결을 선택합니다. 클라이언트 창에서 마우스 왼쪽 단추를 누른 채 끌어 선을 그립니다. 그려진 선은 같은 서버에 연결된 각 클라이언트에 나타나야 합니다. View/Color 메뉴 옵션을 사용하여 각 클라이언트의 색을 변경할 수도 있습니다.
DrawServ 샘플은 경로에 공백이 있는 경우 제대로 등록되지 않습니다. 이 문제를 해결하는 한 가지 방법은 해당 .rgs 파일을 편집하고 모든 %MODULE%에 작은따옴표를 추가하는 것입니다. 예를 들어, 다음이 포함된 줄은
InprocServer32 = s %MODULE%
아래와 같이 변경합니다.
InprocServer32 = s '%MODULE%'
키워드
이 샘플에서는 다음의 키워드를 사용합니다.
AfxMessageBox; ASSERT_VALID; ATLASSERT; AtlUnadvise; BEGIN_COM_MAP; BEGIN_CONNECTION_POINT_MAP; BEGIN_INTERFACE_MAP; BEGIN_MSG_MAP; BEGIN_OBJECT_MAP; CComCoClass; CComControl; CComModule::GetClassObject; CComModule::GetLockCount; CComModule::Init; CComModule::RegisterServer; CComModule::Term; CComModule::Unlock; CComModule::UnregisterServer; CComModule::UpdateRegistryFromResource; CComObjectRoot; CDocument::OnNewDocument; CFrameWnd::AssertValid; CFrameWnd::DockControlBar; CFrameWnd::Dump; CFrameWnd::EnableDocking; CFrameWnd::OnCreate; CFrameWnd::PreCreateWindow; CloseServiceHandle; CoCreateInstance; CoCreateInstanceEx; CoInitialize; CoInitializeSecurity; COM_INTERFACE_ENTRY; COM_INTERFACE_ENTRY_IMPL; COM_INTERFACE_ENTRY_IMPL_IID; COM_INTERFACE_ENTRY2; CONNECTION_POINT_ENTRY; ConnectSink; ControlService; CoUninitialize; CProxyIDrawServ; CreatePen; CreateService; CStatusBar::SetIndicators; CToolBar::EnableDocking; CToolBar::LoadToolBar; CView::DoPreparePrinting; CView::OnLButtonUp(nFlags, point);; CView::PreCreateWindow; CWinApp::AddDocTemplate; CWinApp::LoadStdProfileSettings; CWinApp::ParseCommandLine; CWinApp::ProcessShellCommand; CWindow::SetCapture; DECLARE_GET_CONTROLLING_UNKNOWN; DECLARE_REGISTRY_RESOURCEID; DeleteObject; DeregisterEventSource; DisableThreadLibraryCalls; Disconnect; DisconnectSink; END_COM_MAP; END_CONNECTION_POINT_MAP; END_INTERFACE_MAP; END_OBJECT_MAP; GetModuleFileName; IConnectionPointContainerImpl; IDataObjectImpl; IDispatchImpl; IMPLEMENT_DYNCREATE; Install; INTERFACE_PART; IObjectSafetyImpl; IOleControlImpl; IOleInPlaceActiveObjectImpl; IOleInPlaceObjectWindowlessImpl; IOleObjectImpl; IPersistStorageImpl; IPersistStreamInitImpl; IProvideClassInfo2Impl; IQuickActivateImpl; ISupportErrorInfo; IViewObjectExImpl; IViewObjectExImpl::Draw; LineTo; LoadString; LogEvent; MESSAGE_HANDLER; MessageBox; MoveToEx; OBJECT_ENTRY; OffsetRect; OpenSCManager; OpenService; PostThreadMessage; PtInRect; QueryInterface; RegisterEventSource; ReleaseDC; ReportEvent; SelectObject; SetCapture; SetServiceStatus; SetWindowOrgEx; StartServiceCtrlDispatcher; Uninstall