外部のCOMライブラリを追加できない – プログラミング – Home

外部のCOMライブラリを追加できない
 
通知
すべてクリア

[解決済] 外部のCOMライブラリを追加できない


米粒
 米粒
(@米粒)
ゲスト
結合: 17年前
投稿: 30
Topic starter  

米粒と申します。
環境: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]というエラーが出てよくわかりませんでした)

よろしくお願いします。


引用未解決
トピックタグ
米粒
 米粒
(@米粒)
ゲスト
結合: 17年前
投稿: 30
Topic starter  

自己レスです。

試行錯誤した結果、プロジェクトはVC++のままで

・[プロジェクト]-[クラスの追加]からATLシンプルオブジェクトを選択して適当なクラスを追
加し(CNewcls)、

・クラスビューの[CNewcls]から右クリック-[追加]-[インターフェイスの実装]より上記のライ
ブラリとインターフェイスを選択する

ことによってCNewclsにRunMacro関数を追加することができました。

しかし、実際使用してみるとビルド時に
'CNewcls' : 抽象クラスをインスタンス化できません。
というエラーが出ます。
どうやら継承元のクラス(atlcom.hで定義)で純粋仮想関数を宣言しているからのようですが…
どのように再定義していいかわからず困っています。


返信引用
米粒
 米粒
(@米粒)
ゲスト
結合: 17年前
投稿: 30
Topic starter  

読み返してみるとちょっと回答しづらいかと思うので情報を追加しますと、
市販ソフトというのはMindManager Pro 6
対象となるライブラリはMindManager 6 Type Libraryです。


返信引用
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 22年前
投稿: 1301
 

メーカーさんは何と言うてるんですか?


返信引用
米粒
 米粒
(@米粒)
ゲスト
結合: 17年前
投稿: 30
Topic starter  

> επιστημη さん
プロジェクトを作成する際に、コンソール アプリケーション(.NET)を選択することで参照する
ことができました。

しかし実際使用する時にハンドルできない例外 : System.NullReferenceException: オブジ
ェクト参照がオブジェクト インスタンスに設定されていません。というエラーがでます。

どうやらNULLを参照しようとして例外が発生みたいですが、どのようにインスタンスを設定す
ればよいのか、イマイチよくわかりません。

Interop::MindManager::DocumentsClass *mDoc;
mDoc->Open(C:\\MindMap\\mymap.mmap,password,true); ←ここで例外が起こる

やはり一度メーカーさんに問い合わせてみるのが筋ですかね…


返信引用
とーりすがり
 とーりすがり
(@とーりすがり)
ゲスト
結合: 18年前
投稿: 29
 

.NETはしらんけど
インスタンス作らずにいきなりmDocを叩いてるからじゃねーの?


返信引用
米粒
 米粒
(@米粒)
ゲスト
結合: 17年前
投稿: 30
Topic starter  

> とーりすがりさん

> インスタンス作らずにいきなり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オブジェクトは
有効ではないか、または登録されていません。

というエラーが出てきました。
インスタンス生成時にちゃんと初期値を設定しなきゃダメだ、とかでしょうか?


返信引用
tetrapod
 tetrapod
(@tetrapod)
ゲスト
結合: 21年前
投稿: 830
 

表題の詳細はまったくわからんけど

int i;
int *p=new int;
*p=1; // で i の値が変わらないよー
といっているのと同じ

もっと言うなら
int i;
int j;
++j; // で i の値が変わらないよー

*処理対象にしたい* その COM オブジェクトを探してこなきゃならんだろう
勝手に新しい COM オブジェクトを作っても意味が無い


返信引用
米粒
 米粒
(@米粒)
ゲスト
結合: 17年前
投稿: 30
Topic starter  

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);

↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑

とりあえずこれで一旦解決にしたいと思います。
ありがとうございました。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました