ActiveXインタフェースのメソッド引数を構造体に出来るのでしょうか?

[戻る]
STSK [HomePage] 2006/12/11(月) 19:09:25
最近かなりお世話になっております。

COM(ATLではなくActiveX)インタフェースに関して、構造体を引数に持つ
メソッドを作成したいと思っています。
開発環境はVisual Studio 2005(VC++)Proです。

IDLファイル中に、

 typedef struct tagLOT_INFO   ← ★追加した構造体
 {
   long     nEquipID;
   long     nLotID;
 } LOT_INFO, *LPLOT_INFO;

 [ uuid(C77A8E7F-6C5A-4C33-807A-F4CE6517F9D6), version(1.0) ]
 library Server1
 {
   importlib("stdole32.tlb");
   importlib("stdole2.tlb");

   [ uuid(89E78EF2-CD6F-4B81-81BA-1FA76CF2820D) ]
   dispinterface IServer1
   {
     properties:

     methods:
       [id(1), helpstring("メソッド SetData")] void SetData(LONG nData);
                       :

…のように構造体を定義した所、クラスビューでは追加した構造体の
アイコンが表示される事は確認致しました。

しかし、インタフェースの『メソッド追加ウィザード』では、
戻り値の型/パラメータの型共に、指定する事は出来ませんでした。
(『戻り値の型は、一覧からのバリアント互換型でなければなりません』
  という、エラーダイアログが表示されます)

皆様にご教授頂きたい事は、下記2点です。

 ●ActiveXインタフェースのメソッドに、構造体は指定出来るのか?

 ●指定出来る場合、上記コードでは何が問題なのか?

コメント頂ければ幸いです。

 ※Web&本を見た所、『OLEでは構造体渡しは出来ない』という記述を
  あちこちで見かけました。
  ちょっと試してみた所、ATL-COMでは構造体渡しが可能でしたので、
  何とかActiveXでも使えないものか期待しております…。

超初心者 2006/12/11(月) 23:42:17
(上手い言い方知らんので)IDispatchインタフェース系のヤツか。
VBScriptやVBなどからも使えるコンポーネントですね。

私の知る範囲内では方法を知りません。
C言語互換の構造体を扱えないVBScriptとかで困るじゃん。

無理やりするとしたら

nEquipIDプロパティとnLotIDプロパティをもつLOT_INFOという名前のCOMを作る。
LOT_INFOのインスタンスを作るメソッドをIServer1に作る。

以下はイメージであり実行できるプログラムじゃないです。

a = Server1.createLOT_INFO()
a.nEquipID = 5
a.nLotID = 10
Server1.SetData(a)

STSK [HomePage] 2006/12/12(火) 11:29:45
コメントありがとうございます。

> (上手い言い方知らんので)IDispatchインタフェース系のヤツか。
> VBScriptやVBなどからも使えるコンポーネントですね。

はい。そうです。

> 私の知る範囲内では方法を知りません。
> C言語互換の構造体を扱えないVBScriptとかで困るじゃん。

OCXでしたら構造体(正確にはユーザ定義型?)渡しが可能ですので、
同じOLEだったら可能なのではないか…と思った次第です。

> 無理やりするとしたら
> 
> nEquipIDプロパティとnLotIDプロパティをもつLOT_INFOという名前のCOMを作る。
> LOT_INFOのインスタンスを作るメソッドをIServer1に作る。
> 以下はイメージであり実行できるプログラムじゃないです。
> 
> a = Server1.createLOT_INFO()
> a.nEquipID = 5
> a.nLotID = 10

ここまではなんとなくイメージは伝わるのですが…

> Server1.SetData(a)

こちらが理解出来ません。
IDispatch型の引数を持つメソッドを作成するイメージでしょうか?

STSK [HomePage] 2006/12/12(火) 19:53:05
[[解決]]
自己解決しました。
他にも色々方法はあると思いますが、とりあえずご報告させて頂きます。

メソッドの引数としてはバリアントのポインタ(VARIANT*)で定義し、
 ・メソッドを呼ぶ側(=クライアント)⇒ 構造体をVARIANTに置き換え
 ・メソッドが呼ばれる側(=サーバー)⇒ VARIANTを構造体に置き換え
…とする事で、要求を満たす事が出来ました。

もし『一般的にはこうやるよ!』的なコメントがありましたら、
ぜひともお願い致します。

古いスレッドには追加発言できません。