現在オフラインです。再接続するためにインターネットの接続を待っています

[HOWTO] C++ アプリケーションではなく C アプリケーションから OLE オートメーションを使用する方法

概要
C++ ではなく C でプログラミングする必要がある場合、OLE のビルド ブロックである Component Object Model (COM) は C++ クラスのバイナリ レイアウトに合わせた設計になっているため、OLE オートメーションが困難になることがあります。WINDOWS.H でインクルードされているヘッダー ファイルには、C アプリケーション用の組み込みサポートがあるため、擬似的な C++ オブジェクト動作を使用して OLE オートメーションの呼び出しを行うことができます。この資料では、Microsoft Excel を起動して OLE オートメーションで表示させる Win32 コンソール アプリケーションを、C を使用して構築する方法について説明します。
詳細
次の方法を使用します。
  1. Microsoft Visual C++ 5.0 で "Win32 Console Application" プロジェクトを新規作成します。
  2. (Main.cpp ではなく) Main.c テキスト ファイルをプロジェクトに追加します。
  3. 次のコードを Main.c ファイルに追加します。
          #include <stdio.h>      #include <windows.h>      void main(void) {         IDispatch *pDisp; // Main IDispatch pointer.         unsigned short *ucPtr; // Temporary variable to hold names.         DISPID dispID; // Temporary variable to hold DISPIDs.         CLSID clsid; // Holds CLSID of server after CLSIDFromProgID.         HRESULT hr; // General error/result holder.         char buf[8192]; // Generic buffer for output.         // IDispatch::Invoke() parameters...         DISPPARAMS dispParams = { NULL, NULL, 0, 0 };         VARIANT parm1;         DISPID dispidNamed = DISPID_PROPERTYPUT;         // Initialize OLE Libraries.         OleInitialize(NULL);         {            // Get CLSID for Excel.Application from registry.            hr = CLSIDFromProgID(L"Excel.Application", &clsid);            if(FAILED(hr)) {               MessageBox(NULL, "Excel not registered.", "Error",                          MB_SETFOREGROUND);               return;            }            // Start Excel97, Excel 2000, or Excel 2002 and get its IDispatch pointer.            hr = CoCreateInstance(&clsid, NULL, CLSCTX_LOCAL_SERVER,                                  &IID_IDispatch, (void **)&pDisp);            if(FAILED(hr)) {               MessageBox(NULL, "Couldn't start Excel.", "Error",                          MB_SETFOREGROUND);               return;            }            // Get the 'visible' property's DISPID.            ucPtr = L"Visible";            pDisp->lpVtbl->GetIDsOfNames(pDisp, &IID_NULL, &ucPtr, 1,                                         LOCALE_USER_DEFAULT, &dispID);            sprintf(buf, "DISPID for 'Visible' property = 0x%08lx",                    dispID);            MessageBox(NULL, buf, "Debug Notice", MB_SETFOREGROUND);            // Initiate parameters to set visible property to true.            VariantInit(&parm1);            parm1.vt = VT_I4;            parm1.lVal = 1; // true            // One argument.            dispParams.cArgs = 1;            dispParams.rgvarg = &parm1;            // Handle special-case for property-puts!            dispParams.cNamedArgs = 1;            dispParams.rgdispidNamedArgs = &dispidNamed;            // Set 'visible' property to true.            hr = pDisp->lpVtbl->Invoke(pDisp,               dispID, &IID_NULL, LOCALE_SYSTEM_DEFAULT,               DISPATCH_PROPERTYPUT | DISPATCH_METHOD,               &dispParams, NULL, NULL, NULL            );            if(FAILED(hr)) {               sprintf(buf, "IDispatch::Invoke() failed with %08lx", hr);               MessageBox(NULL, buf, "Debug Notice", MB_SETFOREGROUND);            }            // All done.            MessageBox(NULL, "done.", "Notice", MB_SETFOREGROUND);         }         // Uninitialize OLE Libraries.         OleUninitialize();      }					
  4. コンパイルして実行します。
関連情報
OLE、COM、およびオートメーションに関する一般的な情報の詳細については、『Inside OLE 改訂新版』 (Kraig Brockschmidt 著、マイクロソフトプレス) を参照してください。

IDispatch の詳細については、Microsoft Visual C++ オンライン ヘルプを参照してください。

COM、OLE、および Microsoft Visual C++ を使用した Microsoft Excel のオートメーションについては、『Inside Visual C++ Version 5』 (David J. Kruglinski 著、マイクロソフトプレス) の第 23 章~ 27 章を参照してください。

(c) Microsoft Corporation 1999, All Rights Reserved. Contributions by Joe Crump, Microsoft Corporation.

プロパティ

文書番号:181473 - 最終更新日: 10/27/2005 07:42:00 - リビジョン: 4.2

  • Microsoft Excel 2000 Standard Edition
  • Microsoft Visual C++ 4.0 Standard Edition
  • Microsoft Visual C++ 5.0 Enterprise Edition
  • Microsoft Visual C++ 6.0 Enterprise Edition
  • Microsoft Visual C++ 5.0 Professional Edition
  • Microsoft Visual C++ 6.0 Professional Edition
  • Microsoft Visual C++, 32-bit Learning Edition 6.0
  • Microsoft Excel 2002 Standard Edition
  • Microsoft Excel 97 Standard Edition
  • kbhowto KB181473
フィードバック