• 締切済み

IDLファイルとヘッダーファイルの関係

IDLファイルに //DllRegist.idl import "oaidl.idl"; import "ocidl.idl"; [uuid(1709AE99-7F13-40fa-AE87-BBF66E9A6516), object,dual,pointer_default(unique)] interface IMsg : IUnknown { [id(1), helpstring("メソッド Box")] HRESULT Message(); }; [uuid(7CD8AFF7-293C-4a05-A998-3598EBBF2BB3),version(1.0)] library MessageLibrary { importlib("stdole2.tlb"); importlib("stdole32.tlb"); [uuid(AEB6B6D3-7B45-448e-977E-0A516C28F91D)] coclass Msg { [default] interface IMsg; }; }; として、 ヘッダーファイルに //Interface.h #include"Guid.h" #include<windows.h> interface IMsg : public IUnknown { virtual void Message()=0; }; とすると、 interfaceがふたつ出来るようです。 クラスビュー画面にて確認しました。 どうすればひとつになりますか? よろしくお願いします。

みんなの回答

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

ソースをざっと眺めてみました。 > ULONG STDMETHODCALLTYPE AddRef(void) > { > // 今は何もしません。 > return 0; > } > > ULONG STDMETHODCALLTYPE Release(void) > { > // Release関数は、その名の通りコンポーネントの開放を行います。 > delete this; > return 0; > } AddRefで実装がないのはまずいですね。 呼び出し側は、通常IUnknown->QueryInterface()で、IMsgを取得し、直後にRelease()でIUnknownを解放しますのでdeleteされます。 また、IDLでは、 >interface IMsg : IDispatch と、IMsgがIDispatchから派生していますが、自分で書いているほうでは >interface IMsg : public IUnknown とIUnknownから派生しています。 IDLから生成されるタイプライブラリが何のためにあるのかをしっかり理解してください。また、IDispatchとIUnknownが何なのかをしっかりと勉強してください。 >STDAPI DllGetClassObject(REFCLSID rclsid,REFIID riid,LPVOID *ppReturn) これの実装は? クラスファクトリがなきゃ呼び出し側が正しい手順でインスタンスを取得できないですよ。 と、重要なところはこんな感じでしょうか? なんで、 >VB.NETで以下のコードを実行するとエラーになります。 「まだまだ呼び出せるところまで出来てないから」ってことですね。 あと、 >STDMETHOD(Message)(); ちょっと間違い。 STDMETHOD(Message)() PURE; でした。

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

>どうすればひとつになりますか? 自分で作成した Interface.hの定義を消してください。 IDLをコンパイルすると、「IDLファイル名.h」が生成されているはずです。 これをインクルードして、自分で作成したクラスでこのインターフェイスを継承し、メソッドやプロパティを実装することになります。 で、根本的なところですが、 >[id(1), helpstring("メソッド Box")] HRESULT Message(); と、 >virtual void Message()=0; このメソッド、両方同じと思って記述しているのでしょう?これらは異なります。 >virtual void Message()=0; のほうは、VC++では、 STDMETHOD(Message)(); または virtual HRESULT __stdcall Message() = 0; という記述になります。

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

参考URLは見ていないのですが... interfaceを2つ定義しているから2つクラスビューにアイコンが出ているのではないでしょうか? interface.hの方を struct _declspec(uuid("1709AE99-7F13-40fa-AE87-BBF66E9A6516")) _declspec(novtable)  IMsg : public~ のようにして、interface.hをソリューションエクスプローラから削除すれば少しはいいかもしれません。