원본 : http://www.debuglab.com/knowledge/oleinsert.html
1.요약
MFC OLE Client 로 OLE Container 나 OLE 서버 프로그램을 만들때에는 일반 워드 패드에서와는 달리 '객체 삽입' 상자없이 객체를 삽입할 수 있어야 합니다.
2.본문
기본적으로 MFC AppWizard로 프로그램을 작성하면, MFC 는 OLE 객체를 삽입할때 COleInsertDialog 를 클래스를 사용합니다. 또한 실제로 객체를 삽입할때는 CreateItem() 라는 함수를 호출하는데, 이 함수의 core 소스를 살펴보시면, 프로그램적으로 객체를 삽입하는 방법에 대해서 알 수 있습니다. 아래의 소스를 보시면 아시겠지만, 객체를 관리해 주는 OLE Class 가 이미 MFC 에서 제공되고 있는데(COleClientItem) 이 클래스에 보면 객체 삽입과 관련된 수많은 작업들(예, 파일로 부터 삽입, 새로운 객체 삽입, 객체 Link 등..)을 해주는 함수들이 제공되고 있습니다. 샘플 코드가 제공되고 있는데, 간단합니다.
3.예제
// COleInsertDialog::CreateItem() 함수의 핵심 루틴
//*******Begin Excerpt*******
switch (selType)
{
case linkToFile:
// link to file selected
ASSERT(m_szFileName[0] != 0);
bResult=pNewItem->CreateLinkFromFile(m_szFileName);
break;
case insertFromFile:
// insert file selected
ASSERT(m_szFileName[0] != 0);
bResult=pNewItem->CreateFromFile(m_szFileName);
break;
default:
// otherwise must be create new
ASSERT(selType == createNewItem);
bResult=pNewItem->CreateNewItem(m_io.clsid);
break;
}
//*******End Excerpt*******
/////////////////////////////////
/////////////////////////////////
// Sample Code
/////////////////////////////////
// Compile options needed : None
void CMyView::OnInsertObject()
{
BeginWaitCursor();
CMyOleClientItem* pItem = NULL;
TRY
{
// Create new item connected to this document.
CMyDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
pItem = new CMyOleClientItem(pDoc);
ASSERT_VALID(pItem);
// Get Class ID for Excel sheet
// This is used in creation
CLSID clsid;
if(FAILED(::CLSIDFromProgID("Excel.Sheet",&clsid)))
AfxThrowMemoryException();
// Create the Excel embedded item
if(!pItem->CreateNewItem(clsid))
AfxThrowMemoryException(); // any exception will do
ASSERT_VALID(pItem);
// Launch the server to edit the item.
pItem->DoVerb(OLEIVERB_SHOW, this);
ASSERT_VALID(pItem);
// As an arbitrary user interface design, this sets the
// selection to the last item inserted.
// TODO: reimplement selection as appropriate for your
// application
m_pSelection = pItem; // set selection to last inserted item
pDoc->UpdateAllViews(NULL);
}
CATCH(CException, e)
{
if (pItem != NULL)
{
ASSERT_VALID(pItem);
pItem->Delete();
}
AfxMessageBox(IDP_FAILED_TO_CREATE);
}
END_CATCH
EndWaitCursor();
}
4.참고
MSND : Q137357
[주의] 위의 소스 코드 중에서 ::CLSIDFromProgID() 함수의 첫번째 인자를 LPCSTR 로 사용하고 있는데, 이 부분은 A2COLE() 라는 매크로로 형변환을 해주어야 정상적으로 CLSID 를 얻어옵니다.
예)
USES_CONVERSION; // 형변환 매크로 사용
if(FAILED(::CLSIDFromProgID(A2COLE("MPlayer"),&clsid)))
AfxThrowMemoryException();
- 2001.08.13 Smile Seo -
"MFC" 카테고리의 다른 글
- 현재 실행되고 있는 자신의 경로와 파일명 가져오기 (0)2007/03/01
- Dialog Based 프로그램에서 가속키 기능 넣기 (0)2007/03/01
- '객체 삽입' 상자 없이 객체 삽입하기 (0)2007/03/01
- Registry에 File Icon등록해주기 (0)2007/03/01
- 특정 Registry Key안의 Value값 가져오기 (0)2007/03/01
Tags 객체 삽입

수안이의 컴퓨터 연구실



Leave your greetings.