응용 프로그램 제어
OLE를 사용하려면 애플리케이션과 해당 개체를 실질적으로 제어해야 합니다. OLE 시스템 DLL은 애플리케이션을 자동으로 시작 및 해제하고, 개체의 프로덕션 및 수정을 조정하는 등의 작업을 수행할 수 있어야 합니다. 이 항목의 함수는 이러한 요구 사항을 충족합니다. OLE 시스템 DLL에서 호출되는 것 외에도 애플리케이션에서도 이러한 함수를 호출해야 합니다.
응용 프로그램 제어
속성 | 설명 |
---|---|
AfxOleCanExitApp | 애플리케이션이 종료될 수 있는지 여부를 나타냅니다. |
AfxOleGetMessageFilter | 애플리케이션의 현재 메시지 필터를 검색합니다. |
AfxOleGetUserCtrl | 현재 사용자 제어 플래그를 검색합니다. |
AfxOleSetUserCtrl | 사용자 제어 플래그를 설정하거나 지웁니다. |
AfxOleLockApp | 애플리케이션의 활성 개체 수에 대한 프레임워크의 전역 개수를 증분합니다. |
AfxOleLockControl | 지정된 컨트롤의 클래스 팩터리를 잠급 수 있습니다. |
AfxOleUnlockApp | 애플리케이션에서 프레임워크의 활성 개체 수를 줄입니다. |
AfxOleUnlockControl | 지정된 컨트롤의 클래스 팩터리를 잠금 해제합니다. |
AfxOleRegisterServerClass | OLE 시스템 레지스트리에 서버를 등록합니다. |
AfxOleSetEditMenu | typename Object 명령에 대한 사용자 인터페이스를 구현합니다. |
AfxOleCanExitApp
애플리케이션이 종료될 수 있는지 여부를 나타냅니다.
BOOL AFXAPI AfxOleCanExitApp();
Return Value
애플리케이션이 종료될 수 있으면 0이 아닌 값이고, 그렇지 않으면 0입니다.
설명
개체에 대해 해결되지 않은 참조가 있으면 애플리케이션이 종료될 수 없습니다. 전역 함수 AfxOleLockApp
및 AfxOleUnlockApp
은 각각 애플리케이션의 개체에 대한 참조 수를 늘리거나 줄입니다. 이 카운터가 0이 아니면 애플리케이션이 종료될 수 없습니다. 카운터가 0이 아니면 사용자가 시스템 메뉴에서 닫기를 선택하거나 파일 메뉴에서 종료를 선택할 때 애플리케이션의 기본 창이 숨겨집니다(삭제되지 않음). 프레임워크는 .에서 이 함수를 호출합니다 CFrameWnd::OnClose
.
예시
// Helper exit function for automation server
BOOL CMainFrame::CanExit()
{
if (AfxOleCanExitApp())
{
// No outstanding object counts - go ahead and exit
return TRUE;
}
else
{
// There are outstanding OLE object counts...
// hide app to give user impression that application has exited.
ShowWindow(SW_HIDE);
// take user out of control of the app
AfxOleSetUserCtrl(FALSE);
return FALSE;
}
}
요구 사항
헤더: afxdisp.h
AfxOleGetMessageFilter
애플리케이션의 현재 메시지 필터를 검색합니다.
COleMessageFilter* AFXAPI AfxOleGetMessageFilter();
Return Value
현재 메시지 필터에 대한 포인터입니다.
설명
현재 애플리케이션 개체에 액세스하기 위해 호출하는 것처럼 현재 COleMessageFilter
파생 개체에 액세스하려면 이 함수를 호출 AfxGetApp
합니다.
예시
COleMessageFilter *pFilter = AfxOleGetMessageFilter();
ASSERT_VALID(pFilter);
pFilter->BeginBusyState();
// do things requiring a busy state
pFilter->EndBusyState();
// Another example
//CWinApp-derived class
BOOL CCMFCAutomationApp::InitInstance()
{
CWinApp::InitInstance();
// Initialize OLE libraries
if (!AfxOleInit())
{
AfxMessageBox(IDP_OLE_INIT_FAILED);
return FALSE;
}
CWinThread *pThread = AfxGetThread();
if (pThread != NULL)
{
// Destroy message filter, thereby unregistering it.
delete pThread->m_pMessageFilter;
pThread->m_pMessageFilter = NULL;
// Create the new message filter object.
//CMyMessageFilter is derived from COleMessageFilter
pThread->m_pMessageFilter = new CMyMessageFilter;
ASSERT(AfxOleGetMessageFilter() != NULL);
// Register the new message filter object.
AfxOleGetMessageFilter()->Register();
}
//...
//...
//...
}
요구 사항
헤더: afxwin.h
AfxOleGetUserCtrl
현재 사용자 제어 플래그를 검색합니다.
BOOL AFXAPI AfxOleGetUserCtrl();
Return Value
사용자가 애플리케이션을 제어하는 경우 0이 아닌 경우 그렇지 않으면 0입니다.
설명
사용자가 새 문서를 명시적으로 열거나 만든 경우 사용자가 애플리케이션을 제어할 수 있습니다. 사용자가 OLE 시스템 DLL에서 애플리케이션을 시작하지 않은 경우에도 제어합니다. 즉, 사용자가 시스템 셸을 사용하여 애플리케이션을 시작한 경우입니다.
요구 사항
헤더: afxdisp.h
AfxOleSetUserCtrl
에 대한 AfxOleGetUserCtrl
참조에 설명된 사용자 제어 플래그를 설정하거나 지웁니다.
void AFXAPI AfxOleSetUserCtrl(BOOL bUserCtrl);
매개 변수
bUserCtrl
사용자 제어 플래그를 설정하거나 지울지 여부를 지정합니다.
설명
프레임워크는 사용자가 문서를 만들거나 로드할 때 이 함수를 호출하지만 컨테이너 애플리케이션에서 포함된 개체를 로드하는 등의 간접 작업을 통해 문서를 로드하거나 만들 때는 호출하지 않습니다.
애플리케이션의 다른 작업에서 사용자가 애플리케이션을 제어해야 하는 경우 이 함수를 호출합니다.
요구 사항
헤더: afxdisp.h
AfxOleLockApp
애플리케이션의 활성 개체 수에 대한 프레임워크의 전역 개수를 증분합니다.
void AFXAPI AfxOleLockApp();
설명
프레임워크는 애플리케이션에서 활성 상태인 개체 수의 수를 유지합니다. 및 AfxOleUnlockApp
함수는 AfxOleLockApp
각각 이 수를 증가시키고 감소합니다.
사용자가 활성 개체(활성 개체 수가 0이 아닌 애플리케이션)가 있는 애플리케이션을 닫으려고 하면 프레임워크는 애플리케이션을 완전히 종료하는 대신 사용자의 보기에서 숨깁니다. 이 함수는 AfxOleCanExitApp
애플리케이션을 종료할 수 있는지 여부를 나타냅니다.
클라이언트 애플리케이션에서 계속 사용하는 동안 해당 개체가 제거되는 것이 바람직하지 않은 경우 OLE 인터페이스를 노출하는 모든 개체에서 호출 AfxOleLockApp
합니다. 또한 생성자에서 호출하는 모든 개체의 소멸자에서 호출 AfxOleUnlockApp
AfxOleLockApp
합니다. 기본적으로 COleDocument
(및 파생 클래스) 애플리케이션을 자동으로 잠그고 잠금을 해제합니다.
예시
// Below is a code sample from an Application Wizard-generated SDI
// Application with Automation support. The Application Wizard adds a
// dispatch interface to the document class. AfxOleLockApp() and
// AfxOleUnlockApp() respectively increment and decrement the
// application's object count. When the object count is equal to
// zero and if the user has not taken control of the application,
// the server is terminated.
CCMFCAutomationDoc::CCMFCAutomationDoc()
{
EnableAutomation();
AfxOleLockApp();
}
CCMFCAutomationDoc::~CCMFCAutomationDoc()
{
AfxOleUnlockApp();
}
요구 사항
헤더: afxdisp.h
AfxOleUnlockApp
애플리케이션에서 프레임워크의 활성 개체 수를 줄입니다.
void AFXAPI AfxOleUnlockApp();
설명
자세한 내용은 참조 AfxOleLockApp
하세요.
활성 개체 수가 0에 도달하면 AfxOleOnReleaseAllObjects
호출됩니다.
예시
AfxOleLockApp에 대한 예제를 참조하세요.
요구 사항
헤더: afxdisp.h
AfxOleLockControl
컨트롤과 연결된 동적으로 생성된 데이터가 메모리에 유지되도록 지정된 컨트롤의 클래스 팩터리를 잠급니다.
구문
BOOL AFXAPI AfxOleLockControl( REFCLSID clsid );
BOOL AFXAPI AfxOleLockControl( LPCTSTR lpszProgID );
매개 변수
clsid
컨트롤의 고유 클래스 ID입니다.
lpszProgID
컨트롤의 고유 프로그램 ID입니다.
Return Value
컨트롤의 클래스 팩터리가 성공적으로 잠겼을 경우 0이 아닌 값이고, 그렇지 않으면 0입니다.
설명
이렇게 하면 컨트롤 표시 속도가 상당히 빨라질 수 있습니다. 예를 들어 대화 상자에서 컨트롤을 만들고 이 컨트롤을 AfxOleLockControl
로 잠글 경우에는 대화 상자를 표시 또는 삭제할 때마다 대화 상자를 만들고 종료할 필요가 없습니다. 사용자가 대화 상자를 반복해서 열고 닫는 경우, 컨트롤을 잠그면 성능이 크게 향상될 수 있습니다. 컨트롤을 제거할 준비가 되면 AfxOleUnlockControl
을 호출합니다.
예시
// Starts and locks control's (Microsoft Calendar) class factory.
// Control will remain in memory for lifetime of
// application or until AfxOleUnlockControl() is called.
AfxOleLockControl(_T("MSCAL.Calendar"));
요구 사항
헤더: afxwin.h
AfxOleRegisterServerClass
이 함수를 사용하면 OLE 시스템 레지스트리에 서버를 등록할 수 있습니다.
BOOL AFXAPI AfxOleRegisterServerClass(
REFCLSID clsid,
LPCTSTR lpszClassName,
LPCTSTR lpszShortTypeName,
LPCTSTR lpszLongTypeName,
OLE_APPTYPE nAppType = OAT_SERVER,
LPCTSTR* rglpszRegister = NULL,
LPCTSTR* rglpszOverwrite = NULL);
매개 변수
clsid
서버의 OLE 클래스 ID에 대한 참조입니다.
lpszClassName
서버 개체의 클래스 이름을 포함하는 문자열에 대한 포인터입니다.
lpszShortTypeName
서버 개체 형식의 짧은 이름(예: "Chart")을 포함하는 문자열에 대한 포인터입니다.
lpszLongTypeName
서버 개체 형식의 긴 이름을 포함하는 문자열(예: "Microsoft Excel 5.0 차트")에 대한 포인터입니다.
nAppType
OLE 애플리케이션의 형식을 지정하는 OLE_APPTYPE 열거형에서 가져온 값입니다. 가능한 값은 다음과 같습니다.
OAT_INPLACE_SERVER Server에는 전체 서버 사용자 인터페이스가 있습니다.
OAT_SERVER Server는 포함만 지원합니다.
OAT_CONTAINER 컨테이너는 포함에 대한 링크를 지원합니다.
IDispatch
OAT_DISPATCH_OBJECT 가능한 개체입니다.
rglpszRegister
키에 대한 기존 값을 찾을 수 없는 경우 OLE 시스템 레지스트리에 추가할 키 및 값을 나타내는 문자열에 대한 포인터 배열입니다.
rglpszOverwrite
레지스트리에 지정된 키에 대한 기존 값이 포함된 경우 OLE 시스템 레지스트리에 추가할 키와 값을 나타내는 문자열에 대한 포인터 배열입니다.
Return Value
서버 클래스가 성공적으로 등록되면 0이 아닌 경우 그렇지 않으면 0입니다.
설명
대부분의 애플리케이션은 애플리케이션의 문서 형식을 등록하는 데 사용할 COleTemplateServer::Register
수 있습니다. 애플리케이션의 시스템 레지스트리 형식이 일반적인 패턴에 맞지 않는 경우 더 많은 제어에 사용할 AfxOleRegisterServerClass
수 있습니다.
레지스트리는 키 및 값 집합으로 구성됩니다. rglpszRegister 및 rglpszOverwrite 인수는 각각 키와 NULL 문자('\0'
)로 구분된 값으로 구성된 문자열에 대한 포인터 배열입니다. 이러한 각 문자열에는 위치가 %1부터 %5까지의 문자 시퀀스로 표시되는 대체 가능한 매개 변수가 있을 수 있습니다.
기호는 다음과 같이 채워집니다.
기호 | 값 |
---|---|
%1 | 문자열로 서식이 지정된 클래스 ID |
%2 | 클래스 이름 |
3% | 실행 파일 경로 |
%4 | 짧은 형식 이름 |
5% | 긴 형식 이름 |
요구 사항
헤더: afxdisp.h
AfxOleSetEditMenu
typename Object 명령에 대한 사용자 인터페이스를 구현합니다.
void AFXAPI AfxOleSetEditMenu(
COleClientItem* pClient,
CMenu* pMenu,
UINT iMenuItem,
UINT nIDVerbMin,
UINT nIDVerbMax = 0,
UINT nIDConvert = 0);
매개 변수
pClient
클라이언트 OLE 항목에 대한 포인터입니다.
pMenu
업데이트할 메뉴 개체에 대한 포인터입니다.
iMenuItem
업데이트할 메뉴 항목의 인덱스입니다.
nIDVerbMin
기본 동사에 해당하는 명령 ID입니다.
nIDVerbMax
마지막 동사에 해당하는 명령 ID입니다.
nIDConvert
변환 메뉴 항목의 ID입니다.
설명
서버에서 기본 동사만 인식하는 경우 메뉴 항목은 "동사 typename Object"가 되고 사용자가 명령을 선택하면 nIDVerbMin 명령이 전송됩니다. 서버에서 여러 동사를 인식하면 메뉴 항목이 " typename Object"가 되고 사용자가 명령을 선택할 때 모든 동사를 나열하는 하위 메뉴가 나타납니다. 사용자가 하위 메뉴에서 동사를 선택하면 첫 번째 동사가 선택되면 nIDVerbMin 이 전송되고, 두 번째 동사가 선택되면 nIDVerbMin + 1이 전송됩니다. 기본 COleDocument
구현은 이 기능을 자동으로 처리합니다.
클라이언트의 애플리케이션 리소스 스크립트()에 다음 문이 있어야 합니다. RC) 파일:
<#include afxolecl.rc>
요구 사항
헤더: afxole.h
AfxOleUnlockControl
지정된 컨트롤의 클래스 팩터리를 잠금 해제합니다.
구문
BOOL AFXAPI AfxOleUnlockControl( REFCLSID clsid );
BOOL AFXAPI AfxOleUnlockControl( LPCTSTR lpszProgID );
매개 변수
clsid
컨트롤의 고유 클래스 ID입니다.
lpszProgID
컨트롤의 고유 프로그램 ID입니다.
Return Value
컨트롤의 클래스 팩터리를 성공적으로 잠금 해제한 경우 0이 아닌 경우 그렇지 않으면 0입니다.
설명
컨트롤이 잠겨 있으므로 컨트롤과 AfxOleLockControl
연결된 동적으로 만든 데이터가 메모리에 유지됩니다. 컨트롤이 표시될 때마다 컨트롤을 만들고 제거할 필요가 없으므로 컨트롤 표시 속도가 크게 향상될 수 있습니다. 컨트롤을 제거할 준비가 되면 AfxOleUnlockControl
을 호출합니다.
예시
// Unlock control's (Microsoft Calendar Control) class factory.
AfxOleUnlockControl(_T("MSCAL.Calendar"));
요구 사항
헤더: afxwin.h