[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 - 最終更新日: 2005/10/27 - リビジョン: 1

フィードバック