요약

이 문서에서는 Visual c + +의 Microsoft Office 자동화에 대 한 일반적인 질문에 대해 설명 합니다.

추가 정보

목차

  1. 자동화 란?

  2. 자세한 내용은 유용한 리소스를 찾을 수 있는 새로운 기능을 소개 합니다.

  3. 자동화를 사용할 수 있는 방법은 여러 가지가 있습니다.

  4. COM 이란 무엇 인가요?

  5. Office 응용 프로그램의 실행 중인 인스턴스에 연결 하는 방법은 무엇 인가요?

  6. 선택적 매개 변수를 전달 하는 방법은 무엇 인가요?

  7. Office 응용 프로그램에서 제공 하는 이벤트를 어떻게 catch 하나요?

  8. 자동화 코드가 너무 느립니다. 속도를 어떻게 단축 하나요?

  9. -2147352573 또는 0x80030002와 같이 이러한 큰 오류 값은 무엇을 의미 하나요?

  10. 형식 라이브러리는 무엇 인가요?

  11. 자동화 코드는 Microsoft Excel 95에서 작동 하지만 Microsoft Excel 97에서는 작동 하지 않습니다. 까닭?

  12. 프로그램이 완료 된 후 자동화 하는 응용 프로그램이 메모리에 유지 되는 이유는 무엇 인가요?

  13. Microsoft Office 응용 프로그램 사용자로 수행 하려는 작업을 알고 있지만 자동화를 사용 하 여 프로그래밍 방식으로이 작업을 수행 하려면 어떻게 하나요?

  14. 포함 된 Microsoft Office 응용 프로그램을 자동화할 수 있나요?

  15. Microsoft Office 문서에서 내 문서 속성에 액세스 하려면 어떻게 하나요?

질문 및 답변

  1. 자동화 란? 자동화 (이전의 OLE 자동화)는 기존 프로그램의 기능을 활용 하 여 해당 응용 프로그램에 통합할 수 있는 기술입니다. 예를 들어 microsoft Word를 사용자에 게 표시 하지 않고 Microsoft Word 맞춤법 및 문법 검사 기능을 응용 프로그램에 활용할 수 있습니다. 모든 Microsoft Excel 차트, 인쇄, 데이터 분석 도구를 사용할 수도 있습니다. 이 기술을 통해 개발을 대폭 간소화 하 고 속도를 높일 수 있습니다.

  2. 자세한 내용은 유용한 리소스를 찾을 수 있는 새로운 기능을 소개 합니다. David Kruglinski의 "Visual c + + (ISBN: 1-57231-565-2)의 24 장에서는 일반적인 개요와 몇 가지 멋진 예제도 제공 합니다. 또한 Microsoft 기술 자료를 통해 유용한 정보를 확인할 수 있습니다. 이 문서 자체는 좋은 시작 이며 Microsoft 기술 자료의 다음 문서에서 구체적인 참조를 찾을 수 있습니다.

    152023 OLE 자동화를 연구 하기 위해 리소스 찾기 예제를 배우는 방법을 선호 하는 경우 Microsoft 기술 자료의 다음 문서를 참조 하세요.

    179706 회식에서 MFC를 사용 하 여 새 통합 문서 만들기/서식 지정 & Excel을 자동화 합니다.

  3. 자동화를 사용할 수 있는 방법은 여러 가지가 있습니다. 자동화를 사용 하는 기본적인 방법에는 MFC, #import 및 C/c + 3 가지가 있습니다.

    • MFC를 사용 하 여 Microsoft Office 형식 라이브러리에서 "래퍼 클래스"를 생성 하려면 Visual c + + 클래스를 사용 합니다. 이러한 클래스와 COleVariant, COleSafeArray, COleException 등의 다른 MFC 클래스를 비롯 하 여 자동화 작업을 단순화할 수도 있습니다. 이 방법은 일반적으로 다른 방법에 대해 권장 되며, 대부분의 Microsoft 기술 자료 예제에서는 MFC를 사용 합니다.

    • Visual c + + 5.0에서 사용할 수 있는 새 지시문 #import는 지정 된 형식 라이브러리에서 VC + + "스마트 포인터"를 만듭니다. 이는 매우 강력 하지만 Microsoft Office 응용 프로그램과 함께 사용할 때 일반적으로 발생 하는 참조 계산 문제 때문에 권장 하지 않는 경우가 많습니다.

    • C/c + + 자동화는 훨씬 더 어렵고 MFC 또는 #import 관련 문제를 방지 하는 데 필요한 경우도 있습니다. 기본적으로 이러한 Api는 CoCreateInstance () 및 IDispatch 및 IUnknown 등의 COM 인터페이스를 사용 하 여 작업 합니다.

    C + +의 자동화 사이에는 COM이 c + + 클래스를 기반으로 하기 때문에 일반 C에 비해 약간의 차이가 있습니다. 자세한 내용은 Microsoft 기술 자료의 C 예에 있는 다음 문서를 참조 하세요.

    181473 회식: C 응용 프로그램에서 OLE 자동화 사용

  4. COM 이란 무엇 인가요? 자동화는 COM (구성 요소 개체 모델)을 기반으로 합니다. COM은 인터페이스 기반의 표준 소프트웨어 아키텍처로, 코드가 자체 포함 개체로 구분 되도록 설계 되었습니다. 이를 OOP (개체 지향 프로그래밍) 패러다임의 확장으로 생각 하지만 별도의 응용 프로그램에 적용할 수 있습니다. 각 개체는 인터페이스 집합을 노출 하 고, 초기화, 알림, 데이터 전송과 같은 개체에 대 한 모든 통신은 이러한 인터페이스를 통해 수행 됩니다. COM은 운영 체제와 함께 설치 된 Dll (동적 연결 라이브러리)에서 제공 하는 서비스 집합 이기도 합니다. 자동화는 이러한 서비스를 대부분 사용 합니다. 예를 들어 서버 응용 프로그램 인터페이스의 멤버 함수에 대 한 클라이언트 응용 프로그램의 호출을 패키지 하 고 해당 인수를 사용 하 여 서버 응용 프로그램에 전달 하는 "마샬링" 서비스를 예로 들 수 있습니다. 서버 인터페이스가 클라이언트의 메모리 공간에 노출 되는 것 처럼 보이지만,이는 클라이언트가 자체 프로세스 공간에서 실행 되는 .exe 인 경우에는 그렇지 않습니다. 또한 마샬링은 서버의 메서드에서 반환 값을 프로세스 경계를 넘어 다시 클라이언트의 호출에 안전 하 게 가져옵니다. 다양 한 COM 라이브러리에서 제공 하는 자동화에 필수적으로 필요한 다양 한 서비스가 있습니다. Kraig Brockschmidt, ISBN 1-55615-843-2, "COM 내부"에서 Dale Rogerson-ISBN 1-57231-349-8 및 "자동화 프로그래머용 참조" ISBN 1-57231-584-9과 같은 "Ole-Second Edition"을 포함 하는 정보 원본

  5. Office 응용 프로그램의 실행 중인 인스턴스에 연결 하는 방법은 무엇 인가요? GetActiveObject () API를 사용 합니다. 자동화 서버는 RegisterActiveObject () API를 통해 ROT (개체 테이블 실행)에 자신을 등록 합니다. 자동화 클라이언트는 다음과 같은 코드를 사용 하 여 실행 중인 인스턴스에서 가져올 수 있습니다.

          // Translate server ProgID into a CLSID. ClsidFromProgID      // gets this information from the registry.      CLSID clsid;      CLSIDFromProgID(L"Excel.Application", &clsid);        // Get an interface to the running instance, if any..      IUnknown *pUnk;      HRESULT hr = GetActiveObject(clsid, NULL, (IUnknown**)&pUnk);      ASSERT(!FAILED(hr));      // Get IDispatch interface for Automation...      IDispatch *pDisp;      hr = pUnk->QueryInterface(IID_IDispatch, (void **)&pDisp);      ASSERT(!FAILED(hr));      // Release the no-longer-needed IUnknown...      pUnk->Release();

    참고: 첨부 하려는 Office 응용 프로그램을 여러 번 실행 하는 경우에는 GetActiveObject () API를 사용 하 여 시작한 첫 번째 인스턴스에만 연결할 수 있습니다. 이론적으로 각 개별 인스턴스에 대해 ROT를 반복할 수 있지만, 다른 인스턴스가 이미 ROT에 있는 경우, 즉 자체의 모니커가 항상 동일 하므로 Office 앱이 자신을 등록 하지 않습니다 (구별할 수 없음). 즉, 첫 번째 인스턴스를 제외한 어떠한 인스턴스에만 연결할 수 없습니다. 그러나 Office 앱 에서도 ROT에 문서를 등록 하기 때문에 특정 문서에 대 한 ROT를 반복 하 여 다른 인스턴스에 연결 하 고, 연결 하 고, 응용 프로그램 개체를 가져올 수 있습니다. 다음 Microsoft 기술 자료 문서에는 ROT을 반복 하 고 문서 이름을 찾는 데 사용할 수 있는 몇 가지 코드가 있습니다.

    190985 회식: OCX에서 Excel 또는 Word 문서의 IDispatch 가져오기 단일 인스턴스 응용 프로그램이 기 때문에 PowerPoint에 대해이 작업을 수행할 필요는 없습니다. 실행 중인 인스턴스는 하나만 있을 수 있습니다.

  6. 선택적 매개 변수를 전달 하는 방법은 무엇 인가요? 일부 메서드에는 "optional" 매개 변수가 있습니다. Visual Basic에서는 메서드를 호출할 때 ssl 생략할 수 있습니다. 그러나 Visual c + +를 사용 하 여 전화를 걸 때에는 해당 vt 필드가 VT_ERROR 인 특수 변형을 전달 해야 하며,. * a x 필드는 DISP_E_PARAMNOTFOUND 됩니다. 말하자면:

          // VARIANT used in place of optional-parameters.      VARIANT varOpt;      varOpt.vt = VT_ERROR;      varOpt.scode = DISP_E_PARAMNOTFOUND;

    이는 Visual Basic이 내부적으로 수행 하는 작업입니다.

  7. Office 응용 프로그램에서 제공 하는 이벤트를 어떻게 catch 하나요? 기본적으로 catch 하려는 이벤트 인터페이스 ("싱크")를 구현 하 고 응용 프로그램과 관련 된 advise 연결 ("원본")을 설정 합니다. 다음 문서에서는 Microsoft Word에 대 한 단계별 예제를 제공 합니다.

    183599 회식: VC + +를 사용 하 여 Microsoft Word97 Application 이벤트를 Catch 합니다. 일반적으로 advise 연결을 설정 하려면 서버의 IConnectionPointContainer을 받고 이벤트 인터페이스의 IID를 사용 하 여 FindConnectionPoint ()를 호출 합니다. 이는 IConnectionPoint 인터페이스를 제공 하 고, 이벤트 인터페이스의 인스턴스를 사용 하 여 Advise ()를 호출 하는 것입니다. 그런 다음 서버는 이러한 이벤트가 발생할 때이 인터페이스를 다시 호출 합니다.

  8. 자동화 코드가 너무 느립니다. 속도를 어떻게 단축 하나요? 자동화의 속도 문제에 대 한 일반적인 원인은 데이터를 반복적으로 읽고 쓰는 것입니다. 이는 일반적으로 Excel 자동화 클라이언트에 대 한 것입니다. 그러나 대부분의 사용자는 SAFEARRAY를 사용 하 여이 데이터를 한 번에 작성 하거나 읽을 수 있다는 것을 인식 하지 못합니다. 자세한 내용과 정보 예제는 다음 Microsoft 기술 자료 문서를 참조 하세요.

    186120 회식: MFC를 사용 하 여 Excel을 자동화 하 고 배열로 범위 채우기

    186122 회식: MFC를 사용 하 여 Excel을 자동화 & 범위에서 배열을 가져옵니다.

    179706 회식: MFC를 사용 하 여 Excel을 자동화 하 고 새 통합 문서 만들기/서식 지정 또한 클립보드를 사용 하는 경우에는 성능을 향상 시킬 수 있다는 점을 기억해 야 합니다. 예를 들어 클립보드에 데이터를 복사한 다음 자동화를 사용 하 여 서버에 붙여 넣을 수 있습니다. 또는 그 반대의 경우 서버에 클립보드에 복사 하 고 응용 프로그램에 붙여 넣습니다.

  9. -2147352573 또는 0x80030002와 같은 방대한 오류 값은 무엇을 의미 하나요? 이러한 값은 Hresult로 인식 되며 winerror.h에 정의 되어 있습니다. 첫 번째 비트는 오류 결과 인지 여부를 나타내므로 숫자가 너무 큽니다. Visual c + +와 함께 제공 되는 ErrLook 유틸리티를 사용 하 여 이러한 숫자를 의미 있는 설명으로 변환할 수 있습니다. 프로그래밍 방식으로 오류에 대 한 설명을 가져오려면 FormatMessage () API를 사용할 수 있습니다. FormatMessage () 사용에 대 한 자세한 내용 및 예제는 Microsoft 기술 자료의 다음 문서를 참조 하세요.

    186063 정보: VB/VBA의 자동화 오류 번역

    122957 샘플: Decode32 및 Decode16 OLE 오류 코드 디코더 도구참고: Visual c + + 6.0를 사용 하 고 있으며 디버그 조사식 창에서이 값을 포함 하는 변수를 사용할 경우에는 ", hr" (따옴표 없이)를 추가 하 여 Visual c + +에서 번역 합니다.

  10. 형식 라이브러리는 무엇 인가요? 형식 라이브러리는 C/c + + 헤더 파일과 유사 합니다. 서버에서 게시 하는 인터페이스, 메서드 및 속성을 포함 합니다. Visual c + +와 함께 제공 되는 OLE/COM 개체 뷰어 (Oleview)를 사용 하 여 형식 라이브러리를 볼 수 있습니다. Microsoft Office 95, 97 및 2000의 형식 라이브러리 파일 이름 목록은 다음과 같습니다. Office Application | Type library ------------------------+---------------- Word 95 and prior | wb70en32.tlb Excel 95 and prior | xl5en32.olb Powerpoint 95 and prior | Powerpoint.tlb Access 95 and prior | msaccess.tlb Binder 95 | binder.tlb Schedule+ | sp7en32.olb Project | pj4en32.olb Team Manager | mstmgr1.olb Word 97 | msword8.olb Excel 97 | excel8.olb Powerpoint 97 | msppt8.olb Access 97 | msacc8.olb Binder 97 | msbdr8.olb Graph 97 | graph8.olb Outlook 97 | msoutl8.olb Outlook 98 | msoutl85.olb Word 2000 | msword9.olb Excel 2000 | excel9.olb Powerpoint 2000 | msppt9.olb Access 2000 | msacc9.olb Outlook 2000 | msoutl9.olb Word 2002 | msword.olb Excel 2002 | excel.exe Powerpoint 2002 | msppt.olb Access 2002 | msacc.olb Outlook 2002 | msoutl.olb

  1. 자동화 코드가 Excel 95에서 작동 하지만 Excel 97에서는 작동 하지 않습니다. 무슨 일이죠? Excel의 개체 모델은 버전 95에서 97로 중요 한 변경 사항을 적용 했습니다. Excel 95는 단일 IDispatch 구현에서 모든 메서드 및 속성을 구현 했습니다. 이것은 종종 개체 Y에서 개체 X에 해당 하는 메서드를 호출할 수 있다는 것을 의미 합니다. 이는 좋은 디자인은 아니므로 Office 97에서 각 개체에는 별도의 Idispatch 구현이 있습니다. 즉, 별도의 개체 Y에서 개체 X의 메서드 또는 속성을 요청 하는 경우 0x80020003,-2147352573, "회원을 찾을 수 없습니다." 오류가 발생 합니다. 이 오류가 발생 하지 않도록 하려면 호출 하는 기본 IDispatch 인터페이스가 의미가 올바른지 확인 해야 합니다. 자세한 내용은 Microsoft 기술 자료의 다음 문서를 참조 하세요.

    172108 회식: "회원을 찾을 수 없음", 0x80020003 오류 문제 해결

  2. 프로그램을 완료 한 후 자동화 하는 응용 프로그램이 메모리에 남아 있습니다. 무슨 일이죠? 이는 취득 한 인터페이스를 해제 하는 것을 잊고 추적 해야 하기 때문입니다. 다음은 몇 가지 일반적인 제안 사항과 찾을 사항입니다.

    • #Import를 사용 하는 경우에는 관련 된 참조를 계산 하는 버그 중 하나로 실행 될 가능성이 큽니다. 버그가 작업을 수행 하는 경우가 많지만, 일반적으로 다른 자동화 방법 중 하나를 사용 하는 것이 좋습니다. Office 응용 프로그램에서는 형식 라이브러리와 사용이 매우 복잡 하기 때문에 #import는 제대로 작동 하지 않습니다. 또한 #import 사용 하는 경우 인터페이스 수준의 COM 호출이 많이 발생 하므로 이러한 참조 횟수 문제는 추적 하기가 어렵습니다.

    • IDispatch * (LPDISPATCH)를 반환 하 고 반환 값을 무시 하는 Open 또는 New 등의 메서드를 호출 하 고 있는지 확인 합니다. 이러한 경우 반환 되는 인터페이스를 포기 하 고 더 이상 필요 하지 않을 때 해제 하도록 코드를 변경 해야 합니다.

    • 문제가 사라질 때까지 코드 섹션을 서서히 주석으로 처리 하 고 문제가 시작 되는 위치를 추적 하기 위해 신중 하 게 추가 합니다.

    • 일부 응용 프로그램은 사용자가 응용 프로그램을 "사용" 한 경우에도 계속 실행 됩니다. 자동화 하는 동안이 문제가 발생 하는 경우 응용 프로그램이 나중에 실행 될 수 있습니다. Office 응용 프로그램에는이 동작을 변경 하는 데 읽기/쓰기를 수행할 수 있는 "UserControl" 속성이 있습니다.

    • 또한, 일부 응용 프로그램은 사용자 인터페이스 "작업"이 충분 한 경우 계속 실행 되도록 결정 합니다. 응용 프로그램을 종료 하도록 의도 하는 경우 응용 프로그램 개체에서 Quit () 메서드를 호출 합니다. Quit이 호출 되 면 참조 횟수에 관계 없이 Word가 종료 됩니다. 이는 COM 동작이 필요 하지 않습니다. 그러나 Excel에서는 제대로 숨기기만 하 고 모든 처리 가능 인터페이스가 해제 될 때까지 실행을 유지 합니다. 일반적으로 모든 해결 되지 않은 참조를 해제 하 고 응용 프로그램을 종료 하려면 Quit ()만 호출 해야 합니다.

  3. Office 응용 프로그램 사용자로 수행 하려는 작업을 알고 있지만 자동화를 통해 프로그래밍 방식으로이 작업을 수행 하려면 어떻게 하나요? 관심 있는 내용은 사용 해야 하는 개체, 메서드 및 속성에 대 한 것입니다. 사용자로 수행할 작업에 따라 Word, Excel, Powerpoint의 개체 모델을 탐색 하는 방법을 배우는 가장 좋은 방법은 매크로 레코더를 사용 하는 것입니다. 도구 메뉴에서 매크로 \ ' 새 매크로 기록 '을 선택 하 고 관심 있는 작업을 실행 한 다음 매크로 \ ' 기록 중지 '를 선택 하면 됩니다. 기록이 완료 되 면 도구 메뉴에서 Macro\Macros을 선택 하 고 기록한 매크로를 선택한 다음 편집을 클릭 합니다. 이렇게 하면 기록한 작업을 수행 하는 생성 된 VBA 코드로 이동 됩니다. 기록 된 매크로는 대부분의 경우 가장 적합 한 코드는 아니지만, 간단한 예제에 적합 합니다.

  4. 포함 된 Office 응용 프로그램을 자동화할 수 있나요? 확신할. 이 트릭은 IDispatch 포인터를 가져오고 있습니다 .이는 Visual c + + 기술 참고 39 (TN039)에서 제공 됩니다. 단계별 예제는 다음 Microsoft 기술 자료 문서를 참조 하세요.

    184663 회식: MFC를 사용 하 여 Microsoft Excel 워크시트 포함 및 자동화

  5. Office 문서에서 내 문서 속성에 액세스 하는 방법은 무엇 인가요? 문서 속성에는 자동화를 통해 또는 IPropertyStorage를 통해 액세스할 수 있습니다. 다음 Microsoft 기술 자료 문서에서 각 방법을 보여 줍니다.

    179494 회식: 자동화를 사용 하 여 기본 제공 문서 속성 검색

    186898 회식: VC + +를 사용 하 여 복합 문서 속성을 직접 읽습니다.

추가 도움이 필요하신가요?

기술 향상
교육 살펴보기
새로운 기능 우선 가져오기
Microsoft Insider 참가

이 정보가 유용한가요?

번역 품질에 얼마나 만족하시나요?

사용 경험에 어떠한 영향을 주었나요?

추가 피드백이 있으신가요? (선택 사항)

소중한 의견에 감사드립니다.

×