mfc-ml

2006年03月

31

[mfc 52063] Re: VC++6.0でspreadsheet11を使いたいのですが・・・

社本@ワック様、お世話になります。中間です。

> ラッパクラスの生成がおかしいようですね。

クラスウィザードが完全でないのと同じように考えればよいのですね。
ActiveXがおかしいわけではなく、
ラッパクラスが正しければ正しく動作する、と言うように。

> 私は、ラッパクラスの生成が面倒なのもあって、以下の方法を取っています。
>  ・CWnd::CreateControl() で、ActiveXコントロールを生成
>  ・Wnd::GetControlUnknown() で、IUnknown*を取得
>  ・#importで生成したラッパクラスに代入して使用

この方法はまだ試していないのですが、
リソースではなくプログラムでという事ですね。
どんなラッパクラスが出来るのか気になる所です。

本番ダイアログはボタンを押すと本物のExcelが立ち上がるので、
解決方法とは別に、今回はExcelで修正してもらう事にしようかと思います。
31

[mfc 52062] Re: VC++6.0でspreadsheet11を使いたいのですが・・・

2nd様、お世話になります。中間です。

> 実現しようとしていることは9.0ではダメなのでしょうか?

私も9.0だとうまくいく事は確認しているのですが、
本番環境がOffice2003である事、
またOffice2003のxmlに出力する機能を使いたい事もあり、
11.0 と思っていたのです。
ダイアログ上に限れば9.0で問題ないので、
逆に言えば、必要なDLLの配布(ライセンスの問題もありますが・・・)、
レジストリの登録などで実現する方法などはないのでしょうか?

> 以下、保証しませんが、試しにやってみたこと。

試してみましたが、やはりダイアログは起動しませんでした・・・

本番ダイアログでは、ボタンを押すと本物のExcelが立ち上がる仕様なので、
今回バージョンはExcelで修正して下さい、で行こうかと思っています。
31

[mfc 52061] Re: VC++6.0でspreadsheet11を使いたいのですが・・・


社本@ワックです。

> 手元にある環境で試してみましたが、確かにエラーの発生するコードが生成
> されますね。

ラッパクラスの生成がおかしいようですね。
私もEXCELではないですが、やはり複雑なオブジェクトモデルを
もったもののラッパクラスを生成した時にエラーが出たことがあります。

私は、ラッパクラスの生成が面倒なのもあって、以下の方法を取っています。
 ・CWnd::CreateControl() で、ActiveXコントロールを生成
 ・Wnd::GetControlUnknown() で、IUnknown*を取得
 ・#importで生成したラッパクラスに代入して使用

#importでのラッパクラスの生成も、複雑なオブジェクトモデルをもったものの場合、 

やはりエラーが出ることがありますが、こちらはパラメータで色々と制御できるので
問題が出づらいかと思います。


// 社本 明弘
// http://www.wac-jp.com/programmers/
// http://www.ailight.jp/blog/sha256/
// Microsoft MVP for VC++ (Oct 2003 - Oct 2006)
31

[mfc 52060] Re: VC++6.0でspreadsheet11を使いたいのですが・・・

こんにちは、2ndです。

On Fri, 31 Mar 2006 16:45:25 +0900
Message-ID: <006101c65497$1368fbc0$2701a8c0@your7yzngkdnn0>
"中間" <a...@ans-ipnet.co.jp> wrote:

> そうです。Microsoft Office Spreadsheet 11.0 をプロジェクトに挿入すると、

手元にある環境で試してみましたが、確かにエラーの発生するコードが生成
されますね。

エラーの原因は、CSpreadsheetクラスが、COleDispatchDriverではなく、
CWndの派生クラスになってるからですね。

Spreadsheet 11.0ではなく、10.0と9.0をプロジェクトに追加してみました
が、10.0では同じくダメ、9.0ではエラーの発生しないコードが生成されま
した。

10.0以降は、VC6で使われることを考慮していないのではないでしょうか?

実現しようとしていることは9.0ではダメなのでしょうか?

===

以下、保証しませんが、試しにやってみたこと。

どうしても、Microsoft Office Spreadsheet 11.0を使う必要があるのなら、

    class CSpreadsheet : public CWnd
    {
    protected:
     DECLARE_DYNCREATE(CSpreadsheet)

上記を次のように変更。

    class CSpreadsheet : public CWnd, public COleDispatchDriver
    {
    public:
     CSpreadsheet() {}
     CSpreadsheet(LPDISPATCH pDispatch) : COleDispatchDriver(pDispatch) {}
     CSpreadsheet(const CSpreadsheet& dispatchSrc)
     : COleDispatchDriver(dispatchSrc) {}
    protected:
     DECLARE_DYNCREATE(CSpreadsheet)

すると、.cppの方で、CWndとCOleDispatchDriverの「どちらのInvokeHelper
を呼び出していいかわかんない!」と言われると思うので
    CWnd::InvokeHelper(...)
に置換してやれば全てのコンパイルエラーはとれます。

ただし、MFC自体が多重継承をサポートしていなかったはずなので、プログ
ラムが動くかどうかは知りません(^_^;)

---
2nd - nao4u member
http://nao4u.com/
31

[mfc 52059] Re: [mfc 52058] Re: [mfc 52055] VC++6.0でspreadsheet11を使いたいのですが・・・

社本@ワック様、お世話になります。中間です。

> spreadsheet11とは、EXCEL 2003のコンポーネントのことでしょうか?
> 自動生成されたソースとはどのようなソースでしょうか?
> また、どのようなコンパイルエラーが発生しますか?

そうです。Microsoft Office Spreadsheet 11.0 をプロジェクトに挿入すると、

CSpreadsheet    COCCommands    CXmlMaps
CFilter    CBorders    CButton1    CToolbar    CHeading
C_Range    CButtonMenus    CWindow    CWindows
CHyperlink    CXmlDataBindings    COleFont
CWorkbook    CFilters    CName    COCCommand
CProtection    CPane    CListRows    CButtons
CListObject    CWorkbooks    CSheets    Cnterior
CTitleBar    CButtonMenu    COWCLanguageSettings
CPanes    CAutoFilter    CWorksheet    CListObjects
CWorksheets    CControls    CHeadings    CPicture
CCriteria    CListRow    CNames    CBorder

というクラスが作成され、コンパイルすると

C:\temp\TEST1\xmlmaps.cpp(52) :
 error C2440: 'type cast' :
'struct IDispatch *' から 'class CSpreadsheet' に変換することはできません。
(新しい動作 ; ヘルプを参照)
コンストラクタはソース型を持てません、またはコンストラクタのオーバーロード レゾリューションがあいまいで
す。

というエラーが同様に35個発生し、

CSpreadsheet CXmlMaps::GetApplication()
{
 LPDISPATCH pDispatch;
 InvokeHelper(0x60020004, DISPATCH_PROPERTYGET, VT_DISPATCH,
(void*)&pDispatch, NULL);
→ return CSpreadsheet(pDispatch);
}

となります。
この表現はCSpreadsheetクラスのコンストラクタと考えられますが、
CSpreadsheet に LPDISPATCH を引き数に持つコンストラクタが無い。
コンストラクタが戻り値を返そうとしている。
new されているわけでもない。
となり、解決出来ないのです。
記事検索
Amazon.co.jp
  • ライブドアブログ