タイプライブラリを使わずExcelを操作するには?

解決


gen  2008-05-08 12:29:13  No: 68287  IP: 192.*.*.*

初めて質問させていただきます。
c++でExcelを操作したいのですが、Excelのバージョンに依存しないように
タイプライブラリは使わず
http://support.microsoft.com/?scid=kb;ja;216686&spid=2512&sid=97
のAutoWrap関数を使用して実装しています。

困っているのはinvokeに渡すプロパティなどのインターフェイスがわからないことです。

現在わからないことは4つです。
シート数の取得(GetName?)
シート名の取得(Count?)
アクティブシートの変更(Select?)
指定したシートNoのシートポインタの取得(Item?)

ネットで検索しても情報がなく困っています。
タイプライブラリを使うものは沢山あるのですが・・。
御助言よろしくお願いします。

編集 削除
Blue  2008-05-08 12:58:36  No: 68288  IP: 192.*.*.*

私の場合、MFCでタイプライブラリを使ってExcel用のラッパークラス(COleDispatchDriver)を作ってから、
自動生成されたソースコードをみます。
(COleDispatchDriver::InvokeHelperのところ)

http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=35784&forum=7&start=8
を参考にしてみてください。



また、OLEViewerをつかっても確認できるでしょう。

編集 削除
gen  2008-05-08 14:20:42  No: 68289  IP: 192.*.*.*

回答ありがとうございます

>>私の場合、MFCでタイプライブラリを使ってExcel用のラッパークラス>>(COleDispatchDriver)を作ってから、
>>自動生成されたソースコードをみます。
>>(COleDispatchDriver::InvokeHelperのところ)
初心者でスイマセン、これの意味がよくわからないです・・・。
COleDispatchDriver::InvokeHelperの定義を参照はできましたが
ここからどうやればインターフェイスを取得できるんですか?

>>また、OLEViewerをつかっても確認できるでしょう。
OLEViewerも見てみましたが見ている場所が悪いのかスマートポインタを使うときのインターフェイスらしきものは見つかったのですが
invokeに渡す物を見つけることができませんでした。

編集 削除
Blue  2008-05-08 21:44:01  No: 68290  IP: 192.*.*.*

VC++2005,Excel2003の場合

シート名
>    CString get_Name()
>    {
>        CString result;
>        InvokeHelper(0x6e, DISPATCH_PROPERTYGET, VT_BSTR, (void*)&result, NULL);
>        return result;
>    }
CString strName; // MFCの場合
{
    VARIANT result;
    VariantInit(&result);
    AutoWrap(DISPATCH_PROPERTYGET, &result, pXlBook, L"Name", 0);
    strName = CString(result.bstrVal);
}

シート数
>    long get_Count()
>    {
>        long result;
>        InvokeHelper(0x76, DISPATCH_PROPERTYGET, VT_I4, (void*)&result, NULL);
>        return result;
>    }
long nCount;
{
    VARIANT result;
    VariantInit(&result);
    AutoWrap(DISPATCH_PROPERTYGET, &result, pXlSheets, L"Count", 0); // pXlBookよりpXlSheetsを取得
    nCount = result.lVal;
}


アクティブシートの変更→必要性を感じない。。。


任意のシートを取得
>    LPDISPATCH get_Item(long Index)
>    {
>        LPDISPATCH result;
>        static BYTE parms[] = VTS_I4 ;
>        InvokeHelper(0xaa, DISPATCH_PROPERTYGET, VT_DISPATCH, (void*)&result, parms, Index);
>        return result;
>    }

IDispatch *pXlSheet;
{
    VARIANT result;
    VariantInit(&result);
    VARIANT Index;
    Index.vt = VT_I4;
    Index.lVal = 任意のインデックス
    AutoWrap(DISPATCH_PROPERTYGET, &result, pXlSheets, L"Item", 1, Index); // pXlBookよりpXlSheetsを取得
    pXlSheet = result.pdispVal;
}

編集 削除
gen  2008-05-09 12:19:43  No: 68291  IP: 192.*.*.*

わざわざソースまで書いていただきありがとうございます。
無事解決することができました。

>>私の場合、MFCでタイプライブラリを使ってExcel用のラッパークラス>>(COleDispatchDriver)を作ってから、
>>自動生成されたソースコードをみます。
>>(COleDispatchDriver::InvokeHelperのところ)
これの意味もわかりCOleDispatchDriver::InvokeHelperも見つけることができました。
勉強になりました、ありがとうございます。

編集 削除