Visual C++ 사용 하 여 office 자동화


요약


이 문서는 Visual C++을 사용한 Microsoft Office 자동화와 관련된 일반적인 질문에 답변을 드립니다.

추가 정보


목차

  1. 자동화란 무엇인가요?
  2. 저는 자동화가 무엇인지 잘 모르겠습니다. 제가 어디서 더 배우기 위한 좋은 자료들을 찾을 수 있을까요?
  3. 자동화를 사용할 수 있는 다른 방법들이 있습니까?
  4. COM은 무엇입니까?
  5. Office 응용 프로그램의 실행 중인 인스턴스에 연결할 방법
  6. 선택적 매개 변수를 전달 하는 방법을 합니까?
  7. Office 응용 프로그램에서 지 원하는 이벤트를 알리는 방법
  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++"의 24 장 (ISBN:1-57231-565-2) 좋은 예입니다 뿐만 아니라 일반적인 개요를 제공 합니다. 또한 Microsoft 기술 자료는 정보의 좋은 소스입니다. 이 문서 자체는 좋은 시작 하 고 Microsoft 기술 자료의 다음 문서에서 자세한 참조를 찾을 수 있습니다.
    152023 OLE 자동화 학습 리소스 찾기
    예제를 통해 학습을 원하는 경우에 Microsoft 기술 자료의 다음 문서를 참조 하십시오.
    MFC 하 고 Excel을 자동화 및 새 통합 문서 만들기/서식 179706 방법 사용
  3. 자동화를 사용할 수 있는 다른 방법들이 있습니까? 세 가지 기본적인 방법으로 자동화를 사용 하 여: MFC, #import, 및 C/c + +.
    • MFC를 사용 하 여 클래스를 생성 "래퍼" Microsoft Office 형식 라이브러리에서 Visual C++ 클래스 마법사를 사용 합니다. COleVariant, COleSafeArray, COleException, 다른 MFC 클래스와 이러한 클래스의 자동화 작업을 단순화 합니다. 상대방의이 방법은 일반적으로 권장 하 고 대부분의 Microsoft 기술 자료의 예제는 MFC를 사용 합니다.
    • #import, Visual C++ 5.0에서 제공 되었던 새 지시문에서는 VC + + "스마트 포인터"에서 지정된 된 형식 라이브러리 참조-계산 문제로 인해 Microsoft Office 응용 프로그램과 함께 사용 하는 경우 일반적으로 발생 하는 매우 강력 하지만 권장 하지 않는.
    • C/c + + 자동화는 거의 공격당 하지만 MFC 사용 하 여 오버 헤드 또는 #import를 사용 하 여 문제를 방지 하기 위해 필요한 경우가 있습니다. 기본적으로 CoCreateInstance(), 이러한 Api를 사용 하 고 COM IUnknown 및 IDispatch 인터페이스.
    COM은 c + + 클래스 설계 되었기 때문에 일반 C로 비해 c + +에서 자동화의 몇 가지 약간의 차이점은 반드시. 자세한 내용은 C 예제는 Microsoft 기술 자료의 다음 문서를 참조 하십시오.
    181473 방법: C 응용 프로그램에서 OLE 자동화를 사용 하 여
  4. COM은 무엇입니까? 구성 요소 개체 모델 (COM) 자동화에 기반 합니다. COM은 인터페이스를 기반으로 하며 독립 된 개체로 분리 되도록 하는 표준 소프트웨어 아키텍처입니다. 로 응용 프로그램을 분리 하는 확장 개체 지향 프로그래밍 (OOP) 패러다임을 있지만 해당 생각. 각 개체 인터페이스 집합을 노출 하 고 이러한 인터페이스를 통해 발생 하는 모든 통신을 초기화, 알림 및 데이터 전송을 같은 개체. COM은 또한 운영 체제에 설치 된 동적 연결 라이브러리 (Dll)에 의해 제공 되는 서비스 집합입니다. 자동화 이러한 서비스 중 상당수를 사용합니다. 예를 들어 클라이언트 응용 프로그램이 서버 응용 프로그램의 인터페이스 멤버 함수 호출을 전달 하는 서버 응용 프로그램의 인수를 사용 하는 "Marshalling" 서비스입니다. 서버의 인터페이스 경우가 아니라면 클라이언트가 자체 프로세스 공간에서 실행 중인.exe 경우 클라이언트의 메모리 공간에 노출 되는 것입니다. 마샬링 또한 반환 값을에서 가져옵니다 서버의 메서드 다시 프로세스 경계를 넘어 고 안전 하 게 클라이언트의 호출을. 다양 한 COM 라이브러리에서 제공 되는 자동화 필수적인 많은 다른 서비스가 가지가 있습니다. 에 대 한 정보의 출처 ISBN 1-57231-584-9 "내부 Ole-제 2 호" Kraig Brockschmidt, ISBN 1-55615-843-2, "내부 COM" Dale Rogerson-ISBN 1-57231-349-8을 "자동화 프로그래머 참조"를 포함합니다.
  5. Office 응용 프로그램의 실행 중인 인스턴스에 연결할 방법 GetActiveObject() API를 사용 합니다. 자동화 서버에에서 자동으로 등록 ROT (실행 개체 테이블)에서 RegisterActiveObject() API를 통해. 자동화 클라이언트 코드와 함께 실행 중인 인스턴스에서 같은 가져올 수 있습니다.
          // 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 응용 프로그램 문서 ROT에 등록할 수도, 때문에 첨부할 수 있습니다 성공적으로 다른 인스턴스에 연결, 다음에서 Application 개체를 가져오는 특정 문서를 찾는 ROT 반복 하 여. 다음 Microsoft 기술 자료 문서 ROT 반복 및 문서 이름을 찾고 코드는:
    190985 방법: OCX는에서 IDispatch Excel 또는 Word 문서 가져오기
    필요가 없습니다 PowerPoint에는 단일 인스턴스 응용 프로그램 이므로 하나의 인스턴스만 실행 중 하나만 사용할 수 있습니다.
  6. 선택적 매개 변수를 전달 하는 방법을 합니까? 일부 메서드는 "선택적" 매개 변수가 있습니다. Visual Basic 생략할 수 있습니다 차리지 않고 말하듯이 하는 메서드를 호출할 때. 그러나 Visual C++ 호출할 때.vt 필드는 VT_ERROR, 특별 한 VARIANT를 전달 해야 하 고.scode 필드는 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 하는 이벤트 인터페이스를 구현 하 고 응용 프로그램 ("원본")를 사용 하 여 권장 된 연결을 설정 합니다. 다음 문서를 Microsoft Word에 대 한 단계별 예제를 제공.
    183599 방법: VC + +를 사용 하 여 Microsoft Word97 응용 프로그램 이벤트를 Catch 합니다.
    일반적으로 권장 하는 연결을 설정할 수 있습니다 서버의 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.Exe 유틸리티를 사용할 수 있습니다. 프로그래밍 방식으로 오류에 대 한 설명의 얻을 하려면 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.exe)를 사용 하 여 형식 라이브러리를 볼 수 있습니다. 다음은 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 구현 하는 단일의 모든 메서드 및 속성을 구현합니다. 이것은 종종 수 호출 하는 개체 X, Y 개체에서 의미 하는 방법을 의미 합니다. 이것은 좋은 디자인, Office 97에서 각 개체에 고유한 않으므로 Idispatch 구현을 분리. 즉, 메서드 또는 개체 X Y 별도 개체에서 속성에 대 한 요청을 가져왔는지 오류 0x80020003,-2147352573, "구성원 찾을 수 없습니다." 이 오류를 방지 하려면 기본 IDispatch 인터페이스를 호출 하는 정확한 의미가 있는지 확인 합니다. 자세한 내용은 다음 Microsoft 기술 자료 문서를 참조 하십시오.
    172108 방법: 해결 "구성원 없음", 0x80020003 오류
  2. 내가 자동화 하 고 응용 프로그램을 완료 한 후 메모리에 남아 있습니다. 무슨 일이죠? 대부분 획득 한 인터페이스를 릴리스 잊어버린 추적 하기가 필요 합니다 때문입니다. 여기 몇 가지 일반적인 제안 이며 항목을 찾습니다.
    • #Import를 사용 하는 것이 많이 사용 되는 연결 된 참조 횟수 버그 중 하나로 실행 중일 수 있습니다. 종종 버그, 해결 한 될 수 있지만 다른 자동화 방법 중 하나를 사용 하 여 일반적으로 선호 됩니다. #import 때문에 해당 형식 라이브러리 및 사용 매우 복잡 한 Office 응용 프로그램에서 매우 잘 작동 하지 않습니다. 또한 이러한 참조 수를 세 문제는 인터페이스 수준 COM 호출 많이 #import를 사용 하는 경우 백그라운드 추적 하기가 어렵습니다.
    • IDispatch를 반환 하는 새로 만들기, 열기, 같은 모든 메서드를 호출 하는 경우 확인 합니다 * (LPDISPATCH) 하 고 반환 값을 무시 합니다. 인 경우 다음이 반환 된 인터페이스 포기 하는 릴리스하기 더 이상 필요 하지 않도록 코드를 변경 해야 합니다.
    • 점차 주석으로 문제가 사라진 후 추가할 코드 섹션이 다시 신중 문제가 시작 되는 위치를 추적 합니다.
    • Note 일부 응용 프로그램에서는 사용자가 "액세스 하지 않는" 응용 프로그램 실행을 유지 됩니다. 자동화 하는 동안 이런 일이 발생 하는 경우 다음 응용 프로그램이 아마도 머무르는 나중에 실행 합니다. Office 응용 프로그램에서 Application 개체를 읽고 쓸 수이 동작을 변경할 수 있는 "UserControl" 속성을 가집니다.
    • 또한 일부 응용 프로그램을 실행 하는 충분 한 사용자 인터페이스 "작업" 발생 한 경우 결정 합니다. 응용 프로그램을 종료를 하려는 경우 Quit() 메서드를 호출할 응용 프로그램 개체에. Word는 Quit 호출 될 때 참조 횟수에 관계 없이 종료가 됩니다. 예상 되는 COM 동작은 아닙니다. Excel에서 됩니다만 제대로 자체 그러나 모든 미해결 인터페이스가 해제 될 때까지 실행을 계속 합니다. 일반적으로 모든 해결 되지 않은 참조를 해제 하 고 응용 프로그램을 종료 하려는 경우에 Quit()를 호출 해야 합니다.
  3. Office 응용 프로그램 사용자로 수행 하려는 데 어떻게 알 수 있습니까 어떻게 해야 합니까 프로그래밍 방식으로 자동화를 통해 하지만? 관심 있는 내용을 사용 해야 하는 어떤 개체, 메서드 및 속성입니다. Word, Excel 및 Powerpoint를 사용자로 실행 하려는 작업에 따라의 개체 모델을 이동 하는 방법에 설명 하는 가장 좋은 방법은 매크로 레코더를 사용 하는 것입니다. 원하는 다음 Macro\' 기록 중지 '를 선택합니다 하면 작업 실행, 방금 Macro\' 새 매크로 기록 ' 도구 메뉴 선택 작업이 끝난 후 도구 메뉴에서 Macro\Macros을 선택, 기록한 매크로 선택한 다음 편집을 클릭 기록 합니다. 이것을 타면 생성된 한 VBA 코드를 기록한 작업을 수행 합니다. 기록된 된 매크로 간단한 예에 대 한 최상의 가능한 코드의가 있지만 대부분의 경우에 아주 잘 됩니다.
  4. 포함 된 Office 응용 프로그램을 자동화할 수 있습니까? 절대. IDispatch 포인터를 가져오는 트릭: 있는 Visual C++ 기술 노트 39 (TN039)에서 제공 되는. 단계별 예제는 다음 Microsoft 기술 자료 문서를 참조 하십시오.
    184663 방법: MFC 사용 하 여 Microsoft Excel 워크시트를 자동화 하 고 포함
  5. 내 문서 속성 Office 문서의 어떻게 액세스 합니까? 문서 속성은 자동화 기능을 통해 또는 IPropertyStorage를 통해 직접 액세스할 수 있습니다. 각 방법을 설명 하는 Microsoft 기술 자료의 다음 문서를 참조.
    179494 방법: 자동화를 사용 하 여 기본 제공 문서 속성 검색
    186898 방법: 직접적으로 VC + + 복합 문서 속성 읽기