質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
MFC

MFC (Microsoft Fouondation Class)とは、MicrosoftがVC++用に開発したWindows用アプリケーションのフレームワークです。

COM

COM(Component Object Model)はMicrosoftによるコンポーネントテクノロジーであり、 ソフトウェアの再利用を目的とした技術を指します。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

1回答

2980閲覧

ActiveX(MFC):ブラウザからSetClientSiteが呼び出されるようにしたい

hsk

総合スコア728

MFC

MFC (Microsoft Fouondation Class)とは、MicrosoftがVC++用に開発したWindows用アプリケーションのフレームワークです。

COM

COM(Component Object Model)はMicrosoftによるコンポーネントテクノロジーであり、 ソフトウェアの再利用を目的とした技術を指します。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2016/03/31 03:15

###作成しようとしていること
Visual Studio 2013 で、HTMLに埋め込むための、MFCによるActiveX(MFC ActiveX コントロール プロジェクト)を作成しています。ちなみに、.NET(共通言語ランタイム)サポートを ON(/clr スイッチ)にしています。

###疑問
HTMLに埋め込んでブラウザ(Internet Explorer 11)から呼び出されるとき、ActiveXを格納しているHTMLのURLを知りたい(相対パスで指定されるアドレスを絶対アドレスに変換しなければならないことが理由)ため、コントロールのクラス(COleControlの派生クラス)のSetClientSiteをオーバーライドしてみたつもりなのですが、呼ばれません。

https://support.microsoft.com/ja-jp/kb/181678

C++

1//////////////////////////////////////////////////////////// 2// SampleCtrl.h 3 4class CSampleCtrl: public COleControl 5{ 6 DECLARE_DYNCREATE(CSampleCtrl) 7 8// コンストラクター 9public: 10 CSampleCtrl(); 11 12// オーバーライド 13public: 14 virtual void OnDraw(CDC* pdc, const CRect& rcBounds, const CRect& rcInvalid); 15 virtual BOOL PreCreateWindow(CREATESTRUCT& cs); 16 virtual void DoPropExchange(CPropExchange* pPX); 17 virtual void OnResetState(); 18 virtual DWORD GetControlFlags(); 19 STDMETHOD(SetClientSite)(LPOLECLIENTSITE); // <------ これを追加 20 21// 実装 22protected: 23 ~COpoTiffCtrl(); 24// 以下略 25} 26 27//////////////////////////////////////////////////////////// 28// SampleCtrl.cpp 29 30HRESULT STDMETHODCALLTYPE CSampleCtrl::SetClientSite 31( 32 IOleClientSite *pClientSite //Pointer to an embedded object's client site. 33) 34{ 35 MessageBox(_T("SetClientSiteが呼ばれました")); 36 //HRESULT hrRet = IOleObjectImpl::SetClientSite(pClientSite); // IOleObjectImplが未定義と怒られる。IOleObjectとすると静的メンバーはだめと怒られる。 37 return S_OK; 38} 39

###質問
オーバーライドの方法が間違えているのでしょうか?呼ばれない原因はどこにあるでしょうか?
C++文法の基礎的な誤りかもしれませんが、ご指摘・ご教示のほどお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

また自己解決してしまいました。。MFCとATLとで混同してしまっていました。

ATL で作成した場合は SetClientSite メソッドが呼び出されるようですが、MFCでは OnSetClientSite メソッドが呼び出されるようで、このとき ATL の SetClientSite で渡される引数とおなじようなものが m_pClientSite にパラメータが入っています。

http://www.programmershare.com/3759511/ <- 広告がいろいろ出るのでご注意...

つぎのようにして、HTMLのURLを得ることが出来ました。

C++

1///////////////////////////////////////////////////////////// 2//SampleCtrl.h 3 4class CSampleCtrl : public COleControl 5{ 6 DECLARE_DYNCREATE(CSampleCtrl) 7 8// コンストラクター 9public: 10 CSampleCtrl(); 11 12// オーバーライド 13public: 14 virtual void OnDraw(CDC* pdc, const CRect& rcBounds, const CRect& rcInvalid); 15 virtual BOOL PreCreateWindow(CREATESTRUCT& cs); 16 virtual void DoPropExchange(CPropExchange* pPX); 17 virtual void OnResetState(); 18 virtual DWORD GetControlFlags(); 19 virtual void OnSetClientSite(); // <-追加 20// 以下略 21} 22 23///////////////////////////////////////////////////////////// 24//SampleCtrl.cpp 25 26void CSampleCtrl::OnSetClientSite() 27{ 28 MessageBox(_T("OnSetClientSite が呼ばれました")); 29 30 if (m_pClientSite != NULL) 31 { 32 IMoniker *spmk; 33 LPOLESTR pszDisplayName; 34 35 if (SUCCEEDED(m_pClientSite->GetMoniker(OLEGETMONIKER_TEMPFORUSER, OLEWHICHMK_CONTAINER, &spmk))) 36 { 37 if (SUCCEEDED(spmk->GetDisplayName(NULL, NULL, &pszDisplayName))){ 38 MessageBox(pszDisplayName); 39 } 40 } 41 } 42}

似た内容で、もとのHTMLのタグや属性を調べる方法の質問が見つかったので併記します。

投稿2016/03/31 04:28

編集2016/03/31 04:41
hsk

総合スコア728

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問