Văn phòng tự động hóa bằng cách sử dụng Visual C ++

QUAN TRỌNG: Bài viết này được dịch bằng phần mềm dịch máy của Microsoft chứ không phải do con người dịch. Microsoft cung cấp các bài viết do con người dịch và cả các bài viết do máy dịch để bạn có thể truy cập vào tất cả các bài viết trong Cơ sở Kiến thức của chúng tôi bằng ngôn ngữ của bạn. Tuy nhiên, bài viết do máy dịch không phải lúc nào cũng hoàn hảo. Loại bài viết này có thể chứa các sai sót về từ vựng, cú pháp hoặc ngữ pháp, giống như một người nước ngoài có thể mắc sai sót khi nói ngôn ngữ của bạn. Microsoft không chịu trách nhiệm về bất kỳ sự thiếu chính xác, sai sót hoặc thiệt hại nào do việc dịch sai nội dung hoặc do hoạt động sử dụng của khách hàng gây ra. Microsoft cũng thường xuyên cập nhật phần mềm dịch máy này.

Nhấp chuột vào đây để xem bản tiếng Anh của bài viết này: 196776
Tóm tắt
Bài viết này trả lời câu hỏi thường gặp liên quan đến tự động hóa cho MicrosoftVăn phòng từ Visual c + +.
Thông tin thêm

mục lục

  1. Tự động hóa là gì?
  2. Tôi mới để tự động hóa, nơi có thể tìm thấy các nguồn lực tốt để tìm hiểu thêm?
  3. Có nhiều cách khác nhau, tôi có thể sử dụng tự động hóa?
  4. COM là gì?
  5. Làm thế nào để đính kèm trường hợp chạy của một ứng dụng văn phòng?
  6. Làm thế nào để tôi có thể vượt qua tham số tùy chọn?
  7. Làm thế nào để bắt sự kiện tiếp xúc với các ứng dụng văn phòng?
  8. Mã của tôi tự động hóa là quá chậm. Làm thế nào có thể tốc độ điều?
  9. Các giá trị lớn lỗi, giống như-2147352573 hoặc 0x80030002, có nghĩa là gì?
  10. Một thư viện kiểu là gì?
  11. Tự động hóa mã của tôi làm việc với Microsoft Excel 95, nhưng thất bại với Microsoft Excel 97. Tại sao?
  12. Tại sao không ở các ứng dụng tôi đang tự động hoá lại trong bộ nhớ sau khi chương trình của tôi là hoàn thành?
  13. Tôi biết những gì tôi muốn làm như là một người sử dụng ứng dụng Microsoft Office, nhưng làm thế nào để tôi làm điều này lập trình bằng cách sử dụng tự động hóa?
  14. Tôi có thể tự động hoá một ứng dụng Microsoft Office nhúng?
  15. Làm thế nào để truy cập vào thuộc tính tài liệu của tôi trong một tài liệu Microsoft Office?

Câu hỏi và câu trả lời

  1. Tự động hóa là gì?

    Tự động hóa (trước đây OLE Automation) là một công nghệ mà cho phép bạn tận dụng lợi thế của một chương trình hiện có chức năng và kết hợp nó vào ứng dụng của riêng bạn. Ví dụ, bạn có thể sử dụng Microsoft Từ chính tả và ngữ pháp kiểm tra khả năng vào ứng dụng của bạn không có Microsoft Word Hiển thị cho người dùng của bạn. Bạn thậm chí có thể sử dụng tất cả trong Microsoft Excel biểu đồ, in ấn, và dữ liệu phân tích cụ. Điều này công nghệ có thể rất đơn giản hóa và tăng tốc độ phát triển của bạn.
  2. Tôi mới để tự động hóa, nơi có thể tìm thấy các nguồn lực tốt để tìm hiểu thêm?Chương 24 trên tổng David Kruglinski "Bên trong Visual C ++" (ISBN:1-57231 - 565 - 2) cung cấp một tổng quan cũng như một số ví dụ tuyệt vời. Ngoài ra, cơ sở kiến thức Microsoft là một nguồn thông tin tốt. Điều này bài báo đó là một sự khởi đầu tốt, và bạn có thể tìm thấy cụ thể hơn tài liệu tham khảo trong bài viết sau trong cơ sở kiến thức Microsoft:
    152023 Định vị các nguồn lực để nghiên cứu OLE tự động
    Nếu bạn thích học tập bằng cách ví dụ, hãy xem bài viết sau đây trong cơ sở kiến thức Microsoft:
    179706 HOWTO sử dụng MFC để tự động định & tạo/dạng Excel Workbook mới
  3. Có nhiều cách khác nhau, tôi có thể sử dụng tự động hóa?

    Có ba cách cơ bản, bạn có thể sử dụng tự động hóa: MFC, #import, và C/C + +:

    • Với MFC, sử dụng Visual C++ ClassWizard để tạo ra "bao bọclớp học"từ Microsoft Office loại thư viện. Các lớp học, như cũng như các lớp học khác của MFC, chẳng hạn như COleVariant, COleSafeArray, COleException, đơn giản hóa các nhiệm vụ của tự động hóa. Phương pháp này là thường được đề nghị trên những người khác, và hầu hết của Microsoft Kiến thức cơ sở ví dụ sử dụng MFC.
    • #Import, một chỉ thị mới đã sẵn sàng với Visual C++ 5.0, tạo ra VC ++ "thông minh con trỏ" từ một thư viện cụ thể loại. Nó là rất mạnh mẽ, nhưng thường không được khuyến cáo vì tài liệu tham khảo - đếm vấn đề thường xảy ra khi được dùng với Microsoft Các ứng dụng văn phòng.
    • Tự động hóa C/C++ là nhiều khó khăn hơn, nhưng đôi khi cần thiết để tránh các chi phí với MFC, hoặc các vấn đề với #import. Về cơ bản, bạn làm việc với các API CoCreateInstance() và COM giao diện chẳng hạn như IDispatch và IUnknown.
    Nó là quan trọng cần lưu ý rằng có một số khác biệt nhỏ giữa Tự động hóa từ C++ so với đồng bằng C, bởi vì COM được thiết kế xung quanh thành phố lớp C++. Để biết thêm chi tiết, xin vui lòng xem các bài viết sau đây trong Các cơ sở kiến thức Microsoft cho một ví dụ C:
    181473 HOWTO: Dùng OLE tự động từ một ứng dụng c
  4. COM là gì?

    Tự động hóa dựa trên mô hình đối tượng thành phần (COM). COM là một kiến trúc phần mềm tiêu chuẩn dựa trên giao diện, và được thiết kế để có Mã tách ra thành các đối tượng khép kín. Hãy suy nghĩ của nó như là một phần mở rộngCác mô hình đối tượng theo định hướng lập trình (OOP), nhưng áp dụng cho phân tách các ứng dụng. Mỗi đối tượng đưa ra một tập các giao diện, và tất cả giao tiếp với một đối tượng, chẳng hạn như khởi tạo, thông báo, và truyền dữ liệu, xảy ra thông qua các giao diện này.

    COM cũng là một tập hợp các dịch vụ được cung cấp bởi thư viện liên kết động (DLL) cài đặt với hệ điều hành. Tự động sử dụng nhiều người trong số những người Dịch vụ. Một ví dụ là dịch vụ "Marshalling", những gói các ứng dụng khách hàng các cuộc gọi đến các chức năng thành viên của máy chủ ứng dụng của giao diện và vượt qua những người, có lập luận của họ, đến các máy chủ ứng dụng. Nó làm cho nó xuất hiện rằng giao diện của máy chủ tiếp xúc trong không gian bộ nhớ của khách hàng, mà không phải là trường hợp khi các khách hàng là một .exe chạy trong không gian quá trình riêng của mình. Marshalling cũng được giá trị trả lại từ hệ phục vụ phương pháp trở lại qua quá trình ranh giới và một cách an toàn vào tay cuộc gọi của khách hàng. Có nhiều dịch vụ khác cần thiết để tự động hóa được cung cấp bởi các khác nhau COM thư viện. Bao gồm các nguồn thông tin về những "Bên trong Ole - Ấn bản thứ hai" bởi Kraig Brockschmidt, ISBN 1-55615-843-2, "Bên trong COM" bởi Dale Rogerson - ISBN 1-57231-349-8, và "tự động hóa Lập trình viên của tài liệu tham khảo,"ISBN 1-57231-584-9.
  5. Làm thế nào để đính kèm trường hợp chạy của một ứng dụng văn phòng?

    Sử dụng GetActiveObject() API. Tự động hóa các máy chủ đăng ký chính nó trong ROT (chạy bảng đối tượng), thông qua RegisterActiveObject() API. Tự động hóa khách hàng có thể nhận được tại ví dụ chạy với mã chẳng hạn như:
          // 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();						
    LƯU Ý: Nếu có nhiều trường hợp chạy ứng dụng văn phòng, bạn muốn đính kèm, bạn sẽ chỉ có thể đính kèm vào phần đầu tiên đã được đưa ra bằng cách sử dụng GetActiveObject() API.

    Về lý thuyết, bạn có thể iterate ROT cho mỗi trường hợp cá nhân, nhưng Các ứng dụng văn phòng không đăng ký chính nó, nếu một thể hiện khác đã tại ROT là bởi vì biệt danh cho chính nó luôn luôn như nhau (CNTT không thể được phân biệt anyway). Điều này có nghĩa rằng bạn không thể đính kèm vào bất kỳ trường hợp ngoại trừ những người đầu tiên. Tuy nhiên, bởi vì các ứng dụng văn phòng cũng đăng ký tài liệu của họ trong ROT, bạn thành công có thể đính kèm vào trường hợp khác bởi iterating ROT tìm kiếm một tài liệu cụ thể, gắn với nó, sau đó nhận được ứng dụng đối tượng từ nó. Có một số mã trong bài viết cơ sở kiến thức Microsoft sau đây cho iterating ROT và tìm kiếm một tên tài liệu:
    190985 HOWTO: Nhận được IDispatch một Excel hoặc tài liệu Word từ một OCX
    Bạn không cần phải làm điều này cho PowerPoint, bởi vì nó là một đĩa đơn ứng dụng ví dụ; bạn có thể chỉ cần một ví dụ của nó đang chạy.
  6. Làm thế nào để tôi có thể vượt qua tham số tùy chọn?

    Một số phương pháp có "tùy chọn" tham số. Trong Visual Basic, bạn có thể tình cờ bỏ qua chúng khi gọi các phương pháp. Tuy nhiên, khi kêu gọi với Visual c + +, bạn phải vượt qua một phiên bản đặc biệt có trường .vt là VT_ERROR, và .scode trường là DISP_E_PARAMNOTFOUND. Đó là:
          // VARIANT used in place of optional-parameters.      VARIANT varOpt;      varOpt.vt = VT_ERROR;      varOpt.scode = DISP_E_PARAMNOTFOUND;						
    Điều này là thực sự những gì Visual Basic làm cảnh.
  7. Làm thế nào để bắt sự kiện tiếp xúc với các ứng dụng văn phòng?

    Về cơ bản bạn thực hiện các giao diện sự kiện bạn muốn nắm bắt (các "chìm"), và thiết lập một kết nối tư vấn với các ứng dụng (the "nguồn"). Bài viết sau đây cung cấp cho bạn các ví dụ từng bước cho Microsoft Word:
    183599 HOWTO: Bắt sự kiện ứng dụng Microsoft Word97 bằng cách sử dụng VC ++
    Nói chung, để thiết lập kết nối tư vấn, bạn nhận được các máy chủIConnectionPointContainer và gọi FindConnectionPoint() với IID của giao diện sự kiện. Điều này cung cấp cho bạn một giao diện IConnectionPoint và Tất cả những gì còn lại là để gọi Advise() với một trường hợp của sự kiện của bạn giao diện. Các máy chủ sẽ sau đó các cuộc gọi trở lại thông qua giao diện khi những sự kiện xảy ra.
  8. Mã của tôi tự động hóa là quá chậm. Làm thế nào có thể tốc độ điều?

    Một nguyên nhân phổ biến của các vấn đề tốc độ với tự động hóa là lặp đi lặp lại đọc và viết dữ liệu. Điều này là điển hình cho tự động hóa Excel khách hàng. Tuy nhiên, hầu hết mọi người không nhận thức được rằng dữ liệu này thường có thể bằng văn bản hoặc đọc tất cả một lần sử dụng SAFEARRAY. Xem Microsoft sau Bài viết cơ sở kiến thức để biết thêm thông tin và các ví dụ về thông tin:
    186120 HOWTO: Sử dụng MFC để tự động hoá Excel và điền vào một tầm hoạt động với một mảng
    186122 HOWTO: Sử dụng MFC để tự động hoá Excel & có được một loạt các từ một loạt các
    179706 HOWTO: Sử dụng MFC để tự động hoá Excel và tạo/định dạng bảng tính mới
    Ngoài ra, nó là quan trọng để chỉ ra rằng bằng cách sử dụng có thể bảng tạm đôi khi, cải thiện hiệu suất. Ví dụ, bạn có thể sao chép dữ liệu của bạn Các khay nhớ tạm, sau đó sử dụng tự động hóa bảo với máy chủ để dán. Hoặc phó- ngược lại; cho biết các máy chủ sao chép vào clipboard, và dán vào của bạnứng dụng.
  9. Những gì các giá trị lớn lỗi, chẳng hạn như-2147352573 hoặc 0x80030002 có nghĩa là?

    Những giá trị này được gọi là HRESULTs và được định nghĩa trong winerror.h. Các con số này là rất lớn bởi vì là người đầu tiên chút đại diện cho hay không nó là một kết quả của lỗi. Bạn có thể sử dụng tiện ích ErrLook.Exe mà đi kèm với Visual C ++ để dịch những con số này vào mô tả có ý nghĩa.

    Nếu bạn muốn lập trình có được mô tả các lỗi, bạn có thể sử dụng FormatMessage() API. Xem Microsoft Knowledge sau Các bài viết cơ sở để biết thêm thông tin và các ví dụ về việc sử dụng FormatMessage():
    186063 Thông báo: Dịch tự động hóa lỗi cho VB/VBA
    122957 MẪU: Decode32 và Decode16 OLE lỗi mã giải mã cụ
    LƯU Ý: Nếu bạn đang sử dụng Visual C ++ 6.0 và có một biến có chứa giá trị này trong cửa sổ xem gỡ lỗi, thêm ", nhân sự" (không có dấu ngoặc kép) vào nó để có Visual C++ dịch nó cho bạn!
  10. Một thư viện kiểu là gì?

    Thư viện loại là tương tự như một tập tin tiêu đề C/C++. Nó chứa các giao diện, phương pháp, và các tính năng mà một máy chủ xuất bản. Bạn có thể Xem thư viện kiểu với người xem đối tượng OLE/COM (Oleview.exe) mà đi kèm với Visual c + +. Dưới đây là một danh sách các tên tập tin thư viện kiểu cho Microsoft Office 95, 97, và năm 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. Tự động hóa mã của tôi làm việc với Excel 95, nhưng thất bại với Excel 97. Điều gì đang xảy ra vậy?

    Các mô hình đối tượng cho Excel thực hiện một thay đổi đáng kể từ phiên bản 95 97. Excel 95 thực hiện tất cả các phương pháp và các thuộc tính trong một đĩa đơn thực hiện IDispatch. Điều này có nghĩa rằng thường bạn có thể gọi phương pháp có nghĩa là cho đối tượng X, từ đối tượng Y. Điều này là không một thiết kế tốt, Vì vậy, trong văn phòng 97, mỗi đối tượng có riêng của mình tách Idispatch thực hiện. Điều này có nghĩa rằng nếu bạn yêu cầu cho một phương pháp hay tài sản từ đối tượng X từ một đối tượng riêng biệt Y, bạn nhận được lỗi 0x80020003, -2147352573, "Thành viên không được tìm thấy." Để tránh lỗi này, bạn cần phải thực hiện chắc chắn rằng giao diện IDispatch nằm bên dưới bạn đang thực hiện cuộc gọi từlà một ngữ nghĩa chính xác. Xem Microsoft Knowledge sau Bài viết cơ sở cho biết thêm thông tin:
    172108 HOWTO: Khắc phục sự cố "Thành viên không được tìm thấy", 0x80020003 lỗi
  2. Các ứng dụng tôi đang tự động hoá được trong bộ nhớ sau khi chương trình của tôi là đã hoàn thành. Điều gì đang xảy ra vậy?

    Nhiều khả năng, điều này là bởi vì bạn đã quên để phát hành một mua giao diện và bạn sẽ cần phải theo dõi nó. Dưới đây là một số chung gợi ý và những điều cần tìm kiếm:

    • Nếu bạn đang sử dụng #import, nó là rất có khả năng bạn có thể chạy vào một trong các tài liệu tham khảo-đếm lỗi liên kết với nó. Thông thườngCác lỗi có thể được làm việc xung quanh, nhưng thường nó ưa thích để sử dụng mộtCác phương pháp tự động hóa khác. #Import không làm việc rất tốtvới các ứng dụng văn phòng, bởi vì các loại thư viện và sử dụnglà khá phức tạp. Ngoài ra, vấn đề đếm tham chiếu như vậy là khó khănđể theo dõi bởi vì rất nhiều cấp độ giao diện COM gọiđằng khi sử dụng #import.
    • Kiểm tra xem nếu bạn đang gọi điện thoại bất kỳ phương pháp, chẳng hạn như mở, hoặc mới,mà trở về một IDispatch * (LPDISPATCH), và bỏ qua sự trở lạigiá trị. Nếu bạn đang có, sau đó bạn đang bỏ giao diện này trở lạivà sẽ cần phải thay đổi mã của bạn vì vậy bạn phát hành nó khi không cócòn cần thiết.
    • Dần dần các bình luận trong các phần của mã của bạn cho đến khi vấn đềbiến mất, sau đó thêm nó trở lại khôn ngoan để theo dõi nơi cácvấn đề bắt đầu.
    • Lưu ý rằng một số ứng dụng sẽ ở lại chạy nếu người dùng có thể"xúc động" ứng dụng. Nếu điều này xảy ra trong khi bạn tự động hoá,sau đó các ứng dụng có thể sẽ được chạy sau đó. CácỨng dụng văn phòng có một tài sản "UserControl" trên các ứng dụngđối tượng mà bạn có thể đọc/ghi để thay đổi hành vi này.
    • Ngoài ra, một số ứng dụng sẽ quyết định để chạy nếu đủgiao diện người dùng "hành động" đã xảy ra. Nếu bạn đang có ý định cácCác ứng dụng để thoát khỏi, sau đó gọi phương pháp Quit() của nó trên các ứng dụngđối tượng. Từ sẽ tắt máy bất kể tài liệu tham khảo tin cậy khiBỏ thuốc lá được gọi là. Đây không phải là hành vi dự kiến COM. Excel, Tuy nhiên,đúng chỉ sẽ ẩn chính nó nhưng trú chạy cho đến khi tất cả xuất sắcgiao diện được phát hành. Nói chung, bạn nên thả tất cảxuất sắc tham khảo, và chỉ gọi Quit() nếu bạn có ý định cácứng dụng để bỏ thuốc lá.
  3. Tôi biết những gì tôi muốn làm như là một người sử dụng ứng dụng văn phòng, nhưng làm thế nào để tôi làm điều này lập trình thông qua tự động hóa?

    Những gì bạn đang quan tâm đến việc là đối tượng, phương pháp, và thuộc tính bạn bạn phải sử dụng. Cách tốt nhất để tìm hiểu làm thế nào để điều hướng các mô hình đối tượng của Word, Excel và Powerpoint, dựa trên những gì bạn muốn làm như là một người sử dụng, là để sử dụng Macro ghi. Chỉ cần chọn Macro\ 'Kỷ lục mới Macro' từ các Menu công cụ, thực hiện các công việc bạn đang quan tâm đến, sau đó chọn Macro\ 'dừng ghi âm.' Một khi bạn đã hoàn tất ghi âm, chọn Macro\Macros từ trình đơn Tools, chọn các vĩ mô mà bạn ghi, sau đó nhấp vào chỉnh sửa. Điều này sẽ đưa bạn để tạo ra mã VBA sẽ thực hiện cáctác vụ bạn ghi lại. Hãy nhớ các vĩ mô được ghi nhận sẽ không thể là tốt nhất Mã có thể trong hầu hết trường hợp, nhưng nó đã làm rất tốt cho một cách nhanh chóng Ví dụ.
  4. Tôi có thể tự động hoá một ứng dụng văn phòng nhúng?

    Hoàn toàn. Bí quyết là nhận được con trỏ IDispatch: điều này được đưa ra trong Visual C ++ kỹ thuật nốt 39 (TN039). Xem Microsoft sau Bài viết cơ sở kiến thức cho một ví dụ từng bước:
    184663 HOWTO: Nhúng và tự động hoá một bảng tính Microsoft Excel với MFC
  5. Làm thế nào để truy cập vào thuộc tính tài liệu của tôi trong một tài liệu văn phòng?

    Thuộc tính tài liệu có thể truy cập thông qua tự động hóa, hoặc trực tiếp thông qua IPropertyStorage. Bài viết cơ sở kiến thức Microsoft sau đây chứng minh mỗi phương pháp:
    179494 HOWTO: Sử dụng tự động hóa để lấy được xây dựng trong các thuộc tính tài liệu
    186898 HOWTO: Đọc thuộc tính chất tài liệu trực tiếp với VC ++
coledispatchdriver colesafearray colevariant _com_ptr_t _com_variant_t IPropertySetStorage

Cảnh báo: Bài viết này được dịch tự động

Thuộc tính

ID Bài viết: 196776 - Xem lại Lần cuối: 01/27/2013 08:58:00 - Bản sửa đổi: 4.0

Microsoft Visual C++ 2008 Express Edition, Microsoft Project 2000 Standard Edition, Microsoft Excel 2000 Standard Edition, Microsoft Visual C++ 5.0 Enterprise Edition, Microsoft Visual C++ 5.0 Professional Edition, Microsoft Access 97 Standard Edition, Microsoft Excel 97 Standard Edition, Microsoft PowerPoint 97 Standard Edition, Microsoft Outlook 97 Standard Edition, Microsoft Word 97 Standard Edition, Microsoft Access 2000 Standard Edition, Microsoft PowerPoint 2000 Standard Edition, Microsoft Outlook 2000 Standard Edition, Microsoft Word 2000 Standard Edition, Microsoft Access 2002 Standard Edition, Microsoft Excel 2002 Standard Edition, Microsoft PowerPoint 2002 Standard Edition, Microsoft Word 2002 Standard Edition, Microsoft Outlook 2002 Standard Edition

  • kbsweptvs2008 kbautomation kbmt KB196776 KbMtvi
Phản hồi