• 締切済み

import をせずにmshtmlの機能を使いたい

mshtml を、インタフェースだけインクルードして DLL に処理依頼をさせたいです。 それをする上で、 DDL と、 タイプライブラリ(.tlb)と、 タイプライブラリヘッダー(.tlh)と、 タイプライブラリインプリメント(.tli)と、 インタフェース定義(.IDL)と、 の関係が分からず、困っています。 最終目的としては、 #import を行うことなく、mshtmlの機能を使いたいのです。 【自分の認識】  アーリーバインディングにせよ、  レイトバインディングにせよ、  オブジェクトへの参照/ポインタから起動されたメソッド呼び出しを,  実際に呼び出される関数本体のアドレスに結び付ける、ということができればよいと認識しています。 しかし、 だとしたら、 コンパイル時にバインドさせるときの なぜ .h と lib のような形にならないのでしょう?? レイトバインディングだとしても、 .h があれば、メソッドの種類とIN/OUTはわかりますよね? タイプライブラリ(.tlb)も、 タイプライブラリヘッダー(.tlh)も、 インタフェース定義(.IDL)も、 似たような役割のように感じ、 #import を行うことなく、mshtmlの機能を使うには、 どれとどれを使えばよいのかわからず困っています。

みんなの回答

  • kumatti1
  • ベストアンサー率60% (73/121)
回答No.1

>#import を行うことなく、mshtmlの機能を使うには、 https://msdn.microsoft.com/en-us/library/aa752279%28v=vs.85%29.aspx Mshtml.h をインクルードするだけですけど。

TeferiMage
質問者

お礼

回答ありがとうございました。

TeferiMage
質問者

補足

現状、tliがありませんというコンパイルエラーが出ています。 やろうとしていることは、shellWindowsで取ってきたウィンドウをウェブブラウザか判定し、IWebBrowser型に代入し、そこからIHTMLDocumentを取って処理を進めようとしています。 そのとき、#Import だとコンパイルエラーにならないのですが、.h のインクルードだけだと 上記のエラーになります。

関連するQ&A

  • 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がふたつ出来るようです。 クラスビュー画面にて確認しました。 どうすればひとつになりますか? よろしくお願いします。

  • 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; } };

  • 抽象クラスとインターフェースの使い分け

    抽象クラスとインターフェース、この2つの違い、使い分け方が未だにはっきりとはわかりません・・・ 抽象クラスもインターフェースも実装は持たず、抽象クラスはサブクラスで、インターフェースはそれをインプリメントしたクラスで実装を行うのですよね? 両者ともに言わば中身はなく外枠だけ定義されていると言えると思うのですが、だとしたらこの2つの違いや使い分けってどうなるのでしょうか。 抽象クラスでは部分的な実装を含められることや、インターフェースでは実装クラスが全てのメソッドを実装しなければいけない、複数実装できるといった使い方の違いしかないのでしょうか。 だとしたら実際に抽象クラスとして用意するのかインターフェースとして用意するのかの選択基準はなんなのでしょうか。 明確にこういう場合は抽象クラス、こういう場合はインターフェースなどと言った使い分けってあるのでしょうか。

  • Interface変数について

    C#勉強初めて間もない者です。 Interfaceについて教えて頂きたい事あります。 Interfaceとは規約を定める為のクラスで、メソッドは定義してあるだけで中身はそのInterfaceを継承したクラスで実装する物だと認識しています。 そこで以下のようなコーディングに出会い混乱しました。。。 IList loList = "22,22,".Split(','); ※へたくそな例ですがお許し下さい 上記のコーディングで、中身のないインターフェイスのloList変数が何故抽象メソッドして定義されている「Add」やプロパティ「Count」が使えるようになるのでしょうか? ご質問に答えて下さる方いらっしゃいましたら宜しくお願いします。

  • インターフェイスと抽象クラス

    なかなか理解が難しくて苦しんでいます。 で自分なりに理解したのですが、 抽象クラス→内容に決まっているメソッドと決まっていないメソッドがある場合に決まっていないメソッドを あとからオーバーライドするだけでスーパークラスで定義したすべてのメソッドを利用できる。 これでただしいでしょうか? で、インターフェイスなのですが、この抽象クラスとそっくりなんですが、 (1)変数は定数になる(強制static)(2)メソッドは名前のみの宣言(内容は記述できない) と言うことで、かなり???なのです。 何のために・・・???記述するんでしょうか?? ただひとつメリットがあるとしたら、インターフェイスを実装すると、インターフェイスの配列でインスタンスを 生成出来るということぐらいでしょうか。 そこでちょっとお門違いの疑問かもしれないんですが、 Runnable、やMouselistenerはメソッドの内容が書かれていないのに、 なぜ機能を持たせることが出来るのでしょう??? 認識違い、間違い等ありましたら、教えてください よろしくお願いいたします。

    • ベストアンサー
    • Java
  • IDLファイルからソースファイルの実装方法について

    MessageDll.idlファイルで以下のようにコードを書いて、コンパイルしてできた MessageDll_h.hをインクルードして、 MessageComponent.cppに以下のように記述しました。 実装方法を教えてください。 また、間違っている所は指摘して頂きたいです。 DllRegisterServerとか足りない所はありますが、class内部だけでもお願いします。 お願いします。 //MessageDll.idl import "oaidl.idl"; import "ocidl.idl"; [uuid(7BBCC3A6-033D-4306-BC3D-EA358549F30F),version(1.0)] library ComputerLibrary { importlib("stdole2.tlb"); [uuid(9CAEC929-7E14-4af3-80EE-3D4EFECB3DCC), object] interface IMessage : IUnknown { HRESULT Message(); }; [uuid(0689B073-989C-483c-9757-0770F90A8C86)] coclass MessageClass { [default] interface IMessage; }; }; //MessageComponent.cpp #include"MessageDll_h.h" class MessageClass : public IMessage { public: HRESULT STDMETHODCALLTYPE QueryInterface(REFIID riid, void **ppvObject) { // 指定されたIID(Interface ID)に応じて、そのインターフェースポインタを // *ppvObjectに渡してやります。 if (IsEqualIID(riid, IID_IUnknown) || IsEqualIID(riid, IID_IMessage)) { *ppvObject = static_cast<IMessage *>(this); } else { *ppvObject = NULL; return E_NOINTERFACE; } return S_OK; } ULONG STDMETHODCALLTYPE AddRef() { // 今は何もしません。 return 0; } ULONG STDMETHODCALLTYPE Release() { // Release関数は、その名の通りコンポーネントの開放を行います。 delete this; return 0; } HRESULT STDMETHODCALLTYPE Message() { MessageBox(NULL,"Hello World","",MB_OK); return 0; } };

  • vbaのインポートでエラー

    WinXP+VC7+Excel2003の環境を利用しているのですが、以前はエラーがでなかった箇所で エラーが出るようになりました。 調べると、COMを削除したのがいけないようなのですが、確かに最近PCが重いのでCCleanerというツールで整理したり、不要なプログラムもいくつか削除しました。 エラーを解決するには、どのCOMを入れればいいのでしょうか。 ご教授ください。よろしくお願いします。 【エラー】 d:\・・・\xxx.h(11) : error C4772: #import は存在しない型ライブラリから型を参照しましたす; '__missing_type__' はプレースホルダとして使用されます d:\・・・\release\vbe6ext.tli(248) : error C2440: 'return' : '__missing_type__ *' から '__missing_type__' に変換できません。 この変換には reinterpret_cast, C スタイル キャストまたは関数スタイルのキャストが必要です。 【宣言】 #import "C:\Program Files\Common Files\Microsoft Shared\OFFICE11\Mso.dll" no_namespace rename("DocumentProperties", "DocumentPropertiesXL") rename("RGB", "RGBXL") rename("SearchPath", "SearchPathXL") #import "C:\Program Files\Common Files\Microsoft Shared\VBA\VBA6\Vbe6ext.olb" no_namespace #import "D:\Program Files\Microsoft Office\OFFICE11\excel.exe" rename("DialogBox", "DialogBoxXL") rename("RGB", "RBGXL") rename("DocumentProperties", "DocumentPropertiesXL") rename("ReplaceText", "ReplaceTextXL") rename("CopyFile", "CopyFileXL") no_dual_interfaces no_auto_exclude

  • include<wtsapi32.h>でエラーがでる

    .netを使ってWTSQurySessionInformationのAPIを使う C言語プログラムを作ろうとしています。 ライブラリーにwtsapi32.lib ヘッダーにwtsapi32.h が必要と書いてあったので ライブラリーをインポートし、ヘッダーにPSDKの最新のものをいれましたが、エラーがでます。 c:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\include\WtsApi32.h(109) : error C2061:構文エラー : 識別子 'LPWSTR といったものがたくさんエラーがでます、どうすれば 解決できるでしょうか。調べてもわからないため困っています。OSはXPを使ってます。

  • #import文とC2011エラーの回避方法

    VC++2003にてCOM/ATL属性つきプログラミングをしております。 前々から気にはなっていたのですが、今回本格的に何とかしたいので 質問させていただきます。OSはXPSP3です。 自家製のライブラリを用途の分類ごとにCOMモジュール(DLL)で分けて作っています。 一番基本的なライブラリモジュールで enum emTestType { ttType1, ttType2 }; などという列挙値があり、COMクラスでプロパティ値として使用しています。 __interface TestObject : public IUnknown { [propput] HRESULT TestType([in] emTestType newVal); [propget] HRESULT TestType([out,retval] emTestType* pVal); }; このモジュールをTEST1.dllとしたとき、ほかのモジュールで二次使用するときに TEST2.dll stdafx.h #import "libid:..............." no_namespace named_guids [import(C:\...\TEST1.idl)]; とインポートしていますが、さらにこのモジュール内のオブジェクトで TEST2.h __interface EditObject : public IUnknown { [propput] HRESULT TestType([in] emTestType newVal); [propget] HRESULT TestType([out,retval] emTestType* pVal); }; とenum値を使いまわしています。そしてさらにもうひとつのモジュールでも TEST3.dll stdafx.h #import "libid:..............." no_namespace named_guids [import(C:\...\TEST1.idl)]; TEST3.h __interface ViewObject : public IUnknown { [propput] HRESULT TestType([in] emTestType newVal); [propget] HRESULT TestType([out,retval] emTestType* pVal); }; と使いまわしていて、さらに四つ目のモジュールで TEST4.dll stdafx.h #import "libid:..............." no_namespace named_guids [import(C:\...\TEST1.idl)]; #import "libid:..............." no_namespace named_guids [import(C:\...\TEST2.idl)]; #import "libid:..............." no_namespace named_guids [import(C:\...\TEST3.idl)]; と三次使用したいのですが、このときにC2011エラー(型の再定義)が発生します。 使いまわしたいから基本モジュールに入れているのですが、、、(;_;) 今までは二次使用から型を使わずにULONG値にしてしまっていました。 これはenum型に限らずクラス型でも当然起こります。 私は、これは#import文の引数で何とかなるんじゃないの?と思っているのですが、どうなんでしょうか。 あるいはもっと根本的な治療法があるのでしょうか? よろしくご教授お願いします。

  • ContextCompat.getColor()

    ContextCompat.getColor()についてですが、「メソッドgetColor(Context context, int id)は型ContextCompatで未定義です。」とエラーを吐かれてしまいます。ライブラリはandroid.support.v4.content.ContextCompatをインポートしていて、ターゲットのバージョンはAndroid6.0(API23)です。 なぜこのようなエラーが出るのかが不明なのですが、どなたかエラーを出していそうなものを教えて頂けないでしょうか。