米粒と申します。
環境:Windows 2000 SP4, VC++.NET 2003, MFC使用
VC++で市販の外部プログラムを起動し、マクロを実行するプログラムを作成しています。
外部プログラムを起動するのには ShellExecute を用いて
ShellExecute(NULL,open,C:\\hoge.exe,NULL,NULL,SW_SHOW);
とやって起動させています。
マクロを走らせるのには、そのソフトに付属しているライブラリの関数(RunMacroとします)を
使用したいのですが、ソリューションエクスプローラの[参照の追加](COM)で該当のライブラリ
を追加してもオブジェクトブラウザからRunMacroが参照できないようです。
試しにVBのプロジェクトを作成して同じ手順で参照を追加してみたら、オブジェクトブラウザに
ライブラリが追加されていました。
という事は、このライブラリは素直にVBで使っておけということでしょうか?
また、もしVC++でも使用する方法があるようであればご教授願います。
(OLE/COMオブジェクトビューアからヘッダファイルとして取り込もうともしてみましたが、保
存時に[Error running MIDL.exe:2]というエラーが出てよくわかりませんでした)
よろしくお願いします。
自己レスです。
試行錯誤した結果、プロジェクトはVC++のままで
・[プロジェクト]-[クラスの追加]からATLシンプルオブジェクトを選択して適当なクラスを追
加し(CNewcls)、
・クラスビューの[CNewcls]から右クリック-[追加]-[インターフェイスの実装]より上記のライ
ブラリとインターフェイスを選択する
ことによってCNewclsにRunMacro関数を追加することができました。
しかし、実際使用してみるとビルド時に
'CNewcls' : 抽象クラスをインスタンス化できません。
というエラーが出ます。
どうやら継承元のクラス(atlcom.hで定義)で純粋仮想関数を宣言しているからのようですが…
どのように再定義していいかわからず困っています。
読み返してみるとちょっと回答しづらいかと思うので情報を追加しますと、
市販ソフトというのはMindManager Pro 6
対象となるライブラリはMindManager 6 Type Libraryです。
メーカーさんは何と言うてるんですか?
> επιστημη さん
プロジェクトを作成する際に、コンソール アプリケーション(.NET)を選択することで参照する
ことができました。
しかし実際使用する時にハンドルできない例外 : System.NullReferenceException: オブジ
ェクト参照がオブジェクト インスタンスに設定されていません。というエラーがでます。
どうやらNULLを参照しようとして例外が発生みたいですが、どのようにインスタンスを設定す
ればよいのか、イマイチよくわかりません。
Interop::MindManager::DocumentsClass *mDoc;
mDoc->Open(C:\\MindMap\\mymap.mmap,password,true); ←ここで例外が起こる
やはり一度メーカーさんに問い合わせてみるのが筋ですかね…
.NETはしらんけど
インスタンス作らずにいきなりmDocを叩いてるからじゃねーの?
> とーりすがりさん
> インスタンス作らずにいきなりmDocを叩いてるからじゃねーの?
自分でもそう思いまして、こんな風にインスタンスを生成してみたんですが
Interop::MindManager::DocumentsClass *mDoc = new
Interop::MindManager::DocumentsClass();
mDoc->Open(C:\\MindMap\\mymap.mmap,password,true);
今度は
ハンドルされていない例外 : System.Runtime.InteropServices.COMException
(0x80040154): CLSID '{3F450D7A-3AEE-4D25-8D32-E1E06F5F01E8}' の COMオブジェクトは
有効ではないか、または登録されていません。
というエラーが出てきました。
インスタンス生成時にちゃんと初期値を設定しなきゃダメだ、とかでしょうか?
表題の詳細はまったくわからんけど
int i;
int *p=new int;
*p=1; // で i の値が変わらないよー
といっているのと同じ
もっと言うなら
int i;
int j;
++j; // で i の値が変わらないよー
*処理対象にしたい* その COM オブジェクトを探してこなきゃならんだろう
勝手に新しい COM オブジェクトを作っても意味が無い
tetrapodさん
わかりやすい例えありがとうございます。
処理対象のオブジェクトとしてApplicationClassのインスタンスを生成し、そのメソッドを使
ってmDocs等にオブジェクトを設定していくという形にしたらうまくいきました。
↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
Interop::MindManager::ApplicationClass *mApp = new
Interop::MindManager::ApplicationClass();
Interop::MindManager::Documents *mDocs;
Interop::MindManager::Document *mDoc;
//ドキュメントをgetする
mDocs = mApp->get_Documents(true);
//ドキュメントを開く
mDoc = mDocs->Open(C:\\MindMap\\mymap.mmap,", true);
//マクロを走らせる
mApp->RunMacro(SC:\\MindMap\\Macro1.mmbas);
↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑
とりあえずこれで一旦解決にしたいと思います。
ありがとうございました。