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がふたつ出来るようです。
クラスビュー画面にて確認しました。
どうすればひとつになりますか?
よろしくお願いします。
A 回答 (3件)
- 最新から表示
- 回答順に表示
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;
でした。
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;
という記述になります。
No.1
- 回答日時:
参考URLは見ていないのですが...
interfaceを2つ定義しているから2つクラスビューにアイコンが出ているのではないでしょうか?
interface.hの方を
struct _declspec(uuid("1709AE99-7F13-40fa-AE87-BBF66E9A6516")) _declspec(novtable)
IMsg : public~
のようにして、interface.hをソリューションエクスプローラから削除すれば少しはいいかもしれません。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Android tar.ファイルのインストールについて知りたいです 2 2022/07/23 15:34
- Windows 10 VirtualBox 7のゲストOSでの物理HDDパーティションのマウント方法 2 2023/05/04 13:01
- Java javaのクラスの分け方について質問です。 APIの内部用と外部用でクラスを分けたいのですがインター 2 2022/04/26 16:06
- C言語・C++・C# 大量のデータを読み込んで表示する速度を改善したい 8 2023/05/07 13:29
- MySQL SHOW CREATE TABLE posts;これって何ですか? 3 2022/08/28 22:57
- JavaScript Javascriptが機能せず原因が分からないので教えて頂きたいです 3 2023/06/04 14:50
- C言語・C++・C# Windows Formアプリからコンソールを呼び出して文字を出力させたい 8 2023/05/09 10:53
- その他(クラウドサービス・オンラインストレージ) Google ColabでGoogleドライブのサブフォルダにファイルを生成する方法 1 2022/10/31 17:37
- メディア・マスコミ 処理水放出「なぜ騒ぐの?」...福島の漁業関係者が意見発信……マスコミに反省はなさそうですね? 15 2023/08/24 16:00
- 工学 都市ガスの燃焼速度 3 2022/08/03 12:59
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
レコード件数の表示
-
Java初級 引数に適用できません
-
String.containsの反対機能はあ...
-
Google Apps Script で getRang...
-
メソッド宣言の戻り値の型にク...
-
StringBufferからStringへキャ...
-
java ジェネリックスに関して
-
C# でメソッドに送られてきたOb...
-
public static void main (Stri...
-
c++のキュー
-
javaに"search"という関数 or ...
-
readLine()ではじめから読み直...
-
C# 他のnamespaceにあるメソッ...
-
変数とフィールドの使い分け
-
C#とC++/CLI間でポインタが指す...
-
Fileの読み取り専用の解除
-
C# 点の描き方をおしえてくだ...
-
Java初心者です、エラーの意味...
-
インターフェースについて
-
contextってなんですか?
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
レコード件数の表示
-
Java初級 引数に適用できません
-
String.containsの反対機能はあ...
-
public static void main (Stri...
-
Google Apps Script で getRang...
-
abstract と static を一緒に付...
-
StringBufferからStringへキャ...
-
メソッド宣言の戻り値の型にク...
-
javaに"search"という関数 or ...
-
C# 点の描き方をおしえてくだ...
-
Java初心者です、エラーの意味...
-
なぜprotected overrideなのか
-
親の親のメソッドを呼ぶには?
-
C# でメソッドに送られてきたOb...
-
Javaの関数名が長い?
-
別クラスのmainメソッドの実行
-
[クラス名].[メソッド名].[メソ...
-
コマンドライン引数のチェック
-
contextってなんですか?
-
YYYYMMDD書式の日付に対する適...
おすすめ情報