• ベストアンサー

COMプログラミング教えてください。

//COMプログラミングVC->VB6.0 Visual C++で、 main.cpp , NumberClass.h , NumberClass.cpp , NumberIDL.idl ファイルを以下のコードで作成し、 実行しましたら、正常にコンソールアプリケーションが動作しました。 次に、 VisualBasic6.0から参照設定で、Number.tlbというタイプライブラリを読み込ませて実行させたところ、「Functionまたは変数が必要です。」とエラーが表示されました。 どうすれば解決できますか?よろしくお願いします。 VB6.0のコード Private Sub Command1_Click() Dim a As NumberLibrary.NumberClass Dim b As Long b = a.Add(15, 35) End Sub //main.cpp #include<stdio.h> #include<string.h> #include"NumberClass.h" int main() { NumberClass Number; printf("%d",Number.Add(10,90)); getchar(); return 0; } //NumberClass.h class NumberClass { private: int num; public: int Add(int a,int b); void Save(int a); void Load(int *a); }; //NumberClass.cpp #include"NumberClass.h" int NumberClass::Add(int a,int b) { return a+b; } void NumberClass::Save(int a) { num=a; return; } void NumberClass::Load(int *a) { *a=num; return; } //NumberIDL.idl import "oaidl.idl"; import "ocidl.idl"; [uuid(xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx),version(1.0)] library NumberLibrary { importlib("stdole2.tlb"); [uuid(xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx), object] interface INumber : IUnknown { HRESULT Add([in]int a,[in]int b); HRESULT Save([in]int a); HRESULT Load([out]int *a); }; [uuid(xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx)] coclass NumberClass { interface INumber; } };

質問者が選んだベストアンサー

  • ベストアンサー
  • nitscape
  • ベストアンサー率30% (275/909)
回答No.1

外部から呼び出せるCOMサーバーを作る場合はレジストリに登録する必要があります。またVBで使う場合にはCreateObject()を使ってオブジェクトを生成し Set a = CreateObject("xxxxxxxxxxxxxx") b = a.Add(15, 35) のようになります。 この2点の理由によって正常に動作していないのだと思います。 またmain()での使い方も普通のclassと同じ使い方になっています。外部から呼び出せるようなCOMオブジェクトを作るのでしたら普通はCoCreateInstance()を使ってオブジェクトを生成する方法になるかと思います。 厳しいことを言うようですが、もう一度「COMとは何か?」という基礎から始めた方がいいと思います。

HokUebun
質問者

お礼

回答ありがとうございます。 詳しく教えてくださって感謝しています。 タイプライブラリが生成されたときは、 COMが出来たんだとばかり思っていましたが、 全然でした。 はい、基礎から勉強します。 ありがとうございました。

その他の回答 (2)

  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.3

C++のアプリの方、こんなのCOMじゃないんですけど(^^;;; ただのC++のクラスを、タイプライブラリがあればVBから使えるとお思いですか? 勉強しなおしてください。 最低限、IDLに自分で書いているIUnknownが何なのかは理解しないとどうしようもないですね。 VB側も、#1の方の指摘のとおり、使い方間違ってますし。 #VC++でしたら、個人的にはCOMの作成はATLをお勧めします。

HokUebun
質問者

お礼

回答ありがとうございます。 そうですね。 自分もなんかおかしいなとは思っています。 ご指摘ありがとうございました。 勉強のほうはゆっくりやっていきます。 また、解らないことがあれば教えてください。 お願いします。 とりあえず、今は、 interfaceやIUnknown等の勉強をしています。

  • jmh
  • ベストアンサー率23% (71/304)
回答No.2

こんばんは。 HRESULT Add([in] int a, [in] int b) には、[out, retval] がないので、VB では Sub に見えると思います。

HokUebun
質問者

お礼

こんばんわ。 回答ありがとうございます。 [out, retval]がなければ値を返さないのですね。 良く解りませんでした。 ご指摘ありがとうございます。 とりあえず、今は初歩に帰っています。

関連するQ&A

専門家に質問してみよう