- PR -

C++でEXCELファイルを読む方法

投稿者投稿内容
Blue
大ベテラン
会議室デビュー日: 2005/09/12
投稿数: 230
お住まい・勤務地: 知っている人は知っている
投稿日時: 2007-01-10 10:11
引用:

Tdnr_Symさんの書き込み (2007-01-10 09:48) より:

EXCELのバージョンが決まっていない点に関しては、
すでに#import指令に"no_dual_interfaces"を付けていらっしゃるようなので、
カスタムインターフェイス経由ではなく、IDispatchインターフェイスを使用するようになっています。
つまり一応「遅延バインディング」となっております。


これは知りませんでした。勉強になります。


引用:

自動生成された「excel.tli」というソースファイルで
_com_dispatch_method関数呼び出しの第2引数を定数ではなく、
IDispatch::GetIDsOfNamesで取得したものを使用するほうがよいということです。


ということは、excel.tliを直接編集するということでしょうか?
(_com_dispatch_method関数はまったく知らなかった。(リファレンスにも載っていないし)
Dispath::Invokeを簡単にできるものっぽいですね。。。)

引用:
#私ならMFCのCOleDispatchDriverを使うと思います。
「TypeLibからのMFCクラス」でCOleDispatchDriver派生クラスが自動生成されます。
あとは、ディスパッチIDを動的に取得するように、ちょこちょこっと修正をします。


COleDispatchDriver::InvokeHelperのところですかね。
確かにこちらの方が作業が楽かも。
やす
常連さん
会議室デビュー日: 2005/12/07
投稿数: 20
投稿日時: 2007-01-10 10:25
Blueさん、Tdnr_Symさん

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

まだCOMを勉強不足(現在InsideComを読んでます)で
理解し切れていませんが、有用な情報をありがとうござ
います。ぜひ参考にさせていただきます。

ところで、VBを使ったほうが楽とのことですが、C++か
らVBの関数を呼び出すことは簡単なんでしょうか?
現行のものがC++でできているので、そこにVBを組み込
む方法がわからないものですから。
もしできるとすると、C++とVBでかかれたプロダクトを
1つのDLLとして提供することは可能でしょうか?

ちなみにC#を使ってもVBのように簡単に実現できるの
でしょうか?C#もまだよく分かっていませんが、なんと
なく、C++/VBよりC++/C#の混合プログラミングの方が
親和性が高くて、1つのDLLとして提供できそうな気が
したものですから。

どんどん話がそれて行くようで申し訳ありませんが、
アドバイスいただければ幸いです。

Tdnr_Sym
ぬし
会議室デビュー日: 2005/09/13
投稿数: 464
お住まい・勤務地: 明石・神戸
投稿日時: 2007-01-10 10:29
こんにちは。

引用:

Blueさんの書き込み (2007-01-10 10:11) より:
引用:

自動生成された「excel.tli」というソースファイルで
_com_dispatch_method関数呼び出しの第2引数を定数ではなく、
IDispatch::GetIDsOfNamesで取得したものを使用するほうがよいということです。


ということは、excel.tliを直接編集するということでしょうか?
(_com_dispatch_method関数はまったく知らなかった。(リファレンスにも載っていないし)
Dispath::Invokeを簡単にできるものっぽいですね。。。)



#importで自動生成される.tlh, .tliファイルは何度も生成しなおされてしまうので、編集しにくいですね。
コメントに"DO NOT EDIT!"とも書かれていますし。

思い切って、一度#import文をはずして、拡張子を.tlh, .tliから.h, .cppに変更して
プロジェクトに取り込んでしまうのも、アリなのかなと思うのですが。
Blue
大ベテラン
会議室デビュー日: 2005/09/12
投稿数: 230
お住まい・勤務地: 知っている人は知っている
投稿日時: 2007-01-10 10:40
引用:

Tdnr_Symさんの書き込み (2007-01-10 10:29) より:

#importで自動生成される.tlh, .tliファイルは何度も生成しなおされてしまうので、編集しにくいですね。

思い切って、一度#import文をはずして、拡張子を.tlh, .tliから.h, .cppに変更して
プロジェクトに取り込んでしまうのも、アリなのかなと思うのですが。


やっぱり、生成しなおされるんですね。
MFCの場合は、.hと.cppでプロジェクトに入るので編集は楽そうですね。
Blue
大ベテラン
会議室デビュー日: 2005/09/12
投稿数: 230
お住まい・勤務地: 知っている人は知っている
投稿日時: 2007-01-10 10:50
引用:

やすさんの書き込み (2007-01-10 10:25) より:
ところで、VBを使ったほうが楽とのことですが、C++か
らVBの関数を呼び出すことは簡単なんでしょうか?
現行のものがC++でできているので、そこにVBを組み込
む方法がわからないものですから。
もしできるとすると、C++とVBでかかれたプロダクトを
1つのDLLとして提供することは可能でしょうか?


VBといってもVB6のほうです。(VB.NETだとC#とほぼ同じなんで)
VB6でActiveX DLLを作るので、VC++側では、Excelを使うときのように
COMと同等にして扱えば問題ないのでは?と思っています。

引用:

ちなみにC#を使ってもVBのように簡単に実現できるの
でしょうか?C#もまだよく分かっていませんが、なんと
なく、C++/VBよりC++/C#の混合プログラミングの方が
親和性が高くて、1つのDLLとして提供できそうな気が
したものですから。


VB.NET、C#の場合、組み込まれる対象のVC++のプロジェクトによります。
Win32ベースである場合、結局COMとしてVB.NET,C#で生成されてたクラスライブラリ
を見なければならないのでやっていることは、VB6で作ったActiveX DLLを使うのと
ほぼ同じなんじゃないでしょうか。
(CLR(マネージド)プロジェクトであれば参照設定から簡単に使えるらしいけど。)

それと、なぜVB.NET,C#ではなくVB6を使うと便利といったのかは、
過去ログでも何度も話題に上がっていると思いますが、
VB.NET,C#からExcelを操作するには結構面倒だからです。
(汚いコードを書けば、Excelのプロセスが残ってしまうとかよくあります。)
その分、VB6のCreateObjectを使う方法であれば、よくわからないけど、
VB.NET,C#ほどシビアにならなくてもイイっぽいです。
(VC++の場合も_com_ptr_tクラスを使えば便利なんです。MFCの場合はよくわからない。)
やす
常連さん
会議室デビュー日: 2005/12/07
投稿数: 20
投稿日時: 2007-01-10 13:31
Blueさん,

ご意見ありがとうございます。

私には話しが高度過ぎて内容の半分ほどしか理解できませんが、
今から他言語を勉強するより、C++でCOMを勉強したほうが早そう
なので、今回はご教示いただいた方法を参考にC++(MFCになるか
な?)で取り組みたいと思います。

また行き詰ったらご相談させてください。
どうもありがとうございました。

スキルアップ/キャリアアップ(JOB@IT)