2017-11-01 37 views
0

私はMFCのDLL共有と私のWin32アプリケーションのコーディングだと私は、ActiveXがそれにを制御使用しようとしていましたか?または私はただ時間を無駄にしていますか?は、win32アプリケーションでactiveXコントロールを使用することは可能ですか?ことは可能であるが、

+0

はい、可能ですが、それは恐ろしいことがあります。より具体的な質問がなければ何も言い難い。 – mnistic

+0

@mnisticコメントありがとうございました.MFC共有DLLを使用してWin32アプリケーションでActiveXコントロールを使用する方法についていくつかのドキュメントやチュートリアルなどの知識を得ることができますか? –

+0

@EricsonGomesこれはMFCとは関係ありません。 MFC以外のWindowsアプリケーションの多くは、ActiveXコントロールをホストします。 –

答えて

1

新しいMFCプロジェクトを作成し、あなたはActiveXのサポート(例VS2008を使用して)を起動してください:

enter image description here

多くの場合、あなたはダイアログウィンドウ内からActiveXコントロールを使用します。右のデザイナービューでダイアログをクリックすると「挿入ActiveXコントロール」を選択し、希望のActiveXを選択:

enter image description here

あなたは自由にダイアログ外のActiveXコントロールを埋め込みたい場合は、ATLのラッパーがありますMFCの場合しかし、これはもう少し難しく、次のようになります。

#include "stdafx.h" 
#include "atlbase.h" 
#include "oleidl.h" 
#include "comdef.h" 

... 
... 

    AtlAxWinInit(); 
    pPluginWnd = new CAxWindow(); 
    CRect r = GetParent()->GetClientRect(); 
    if (!pPluginWnd->Create(GetParent()->m_hWnd, r, "ActiveX Plugin Window", WS_VISIBLE 
     | WS_CHILD | WS_CLIPCHILDREN | WS_CLIPSIBLINGS | WS_VSCROLL | WS_HSCROLL))) 
    { 
     AfxMessageBox("Couldn't create the ActiveX host window"); 
     return; 
    } 

    LPUNKNOWN pUnk; 
    pPluginWnd->QueryControl(&pUnk); 
    IDispatch *spDispatch; 
    HRESULT hRes = pUnk->QueryInterface(__uuidof(spDispatch), (void **) &spDispatch); 
    if (hRes != S_OK) 
    { 
     AfxMessageBox("Couldn't query the ActiveX interface"); 
     return; 
    } 

    // get a method called 'Init' in the ActiveX to pass a long integer parameter to it 
    long nMyValueToPass; 
    DISPID dispid; 
    OLECHAR FAR szMember[5]; 
    MultiByteToWideChar(CP_ACP, 0, "Init", -1, szMember, 5); 
    OLECHAR FAR *pszMember = szMember; 
    DISPPARAMS dispparams = { NULL, NULL, 0, 0 }; 
    VARIANT vRet; 
    COleVariant vParam(nMyValueToPass,VT_I4); 
    EXCEPINFO excepinfo; 
    UINT nArgErr; 
    dispparams.rgvarg = (LPVARIANT)vParam; 
    dispparams.cArgs = 1; 
    dispparams.cNamedArgs = 0; 

    hRes = spDispatch->GetIDsOfNames(IID_NULL, &pszMember, 1, LOCALE_SYSTEM_DEFAULT, &dispid); 
    if (hRes != S_OK) 
    { 
     AfxMessageBox("Init method couldn't be found in ActiveX control"); 
     return; 
    } 

    // call the Init method 
    hRes = spDispatch->Invoke(dispid, IID_NULL, LOCALE_SYSTEM_DEFAULT, 
     DISPATCH_METHOD, &dispparams, &vRet, &excepinfo, &nArgErr); 
+0

[新規プロジェクト]ウィザードでActiveXサポートを有効にする必要はありません。このオプションを有効にして作成されていないプロジェクトにActiveXコントロールを追加することはできます。それはどんな種類の魔法も実行しません。コードを追加するだけです。それに加えて、C++からの 'IDispatch'インターフェイスを介してActiveXコントロールを呼び出すことは、ActiveXコントロールの最も一般的な使用例です。実装は*非常に混乱しています。 'L" Init "文字列リテラルを使って' MultiByteToWideChar'を呼び出す根拠は何ですか?またはRAIIラッパーと裸の 'VARIANT'の幸せな混合物? – IInspectable

+0

* sigh *申し訳ありませんが、私はあなたに前に言ったと思います。私はperectではありません。しかし、私の具体的な実装の詳細はここでは関心事ではありません。それは実際には歴史的な非ユニコードソースで、VSから6回またはそれ以前のものです。説明するために変更されましたが、最適化されていません。そして、はい、ダイアログボックスでActiveXコントロールを使用することは、通常の使用例です。副詞「しばしば」で表現しようとしました。しかし、私はちょうどニックピッカーを恐れて、私の答えはゴミであると言いました。なぜなら質問にはActiveXがダイアログ内で使われなければならないということが明記されていなかったからです。 – thomiel

+0

C++のActiveXコントロールの 'IDispatch'インターフェースを通ることは、最も一般的な使用事例ではないことを指摘しておくのは愚かではありません。静的に型付けされたインターフェースを照会し、 'IDispatch'の25行以上の行を1つの呼び出しに集約します。コンパイラによって静的にチェックされます。私はこのことのどれがダイアログと関係があるのか​​分かりません。 – IInspectable

関連する問題