Winapi 是否可以将activeX控件与win32应用程序一起使用?

Winapi 是否可以将activeX控件与win32应用程序一起使用?,winapi,mfc,activex,Winapi,Mfc,Activex,我正在用MFC共享DLL编写我的Win32应用程序,我试图在其上使用ActiveX控件,这可能吗?或者我只是在浪费时间?创建新的MFC项目时,请确保激活ActiveX支持(例如使用VS2008): 通常,您希望在对话框窗口中使用ActiveX控件。右键单击designer视图中的对话框,选择“插入ActiveX控件”,然后选择所需的ActiveX: 如果您想在对话框外部自由嵌入ActiveX控件,那么MFC有一个ATL包装器。但这有点棘手,看起来像这样: #include "stdafx.h

我正在用MFC共享DLL编写我的Win32应用程序,我试图在其上使用ActiveX控件,这可能吗?或者我只是在浪费时间?

创建新的MFC项目时,请确保激活ActiveX支持(例如使用VS2008):

通常,您希望在对话框窗口中使用ActiveX控件。右键单击designer视图中的对话框,选择“插入ActiveX控件”,然后选择所需的ActiveX:

如果您想在对话框外部自由嵌入ActiveX控件,那么MFC有一个ATL包装器。但这有点棘手,看起来像这样:

#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);

创建新的MFC项目时,请确保激活ActiveX支持(例如使用VS2008):

通常,您希望在对话框窗口中使用ActiveX控件。右键单击designer视图中的对话框,选择“插入ActiveX控件”,然后选择所需的ActiveX:

如果您想在对话框外部自由嵌入ActiveX控件,那么MFC有一个ATL包装器。但这有点棘手,看起来像这样:

#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);

是的,这是可能的,但它会变得挑剔。如果没有更具体的问题,很难说其他任何事情。@M谢谢你的评论,你能告诉我一些文档、教程或任何方式,让我了解在带有MFC共享DLL的Win32应用程序上使用activex控件的知识吗?@EricsonGomes这与MFC无关。大量的非MFC Windows应用程序承载ActiveX控件。那么大量的非MFC Windows应用程序会是什么呢?我需要一个root用户来学习在C++中开发Windows的任何方式,Ur@ ReMyLeBeAuto能给我一些光吗?ActiveX是一个很大的主题,有很多关于它的信息。是的,这是可能的,但它会变得很挑剔。如果没有更具体的问题,很难说其他任何事情。@M谢谢你的评论,你能告诉我一些文档、教程或任何方式,让我了解在带有MFC共享DLL的Win32应用程序上使用activex控件的知识吗?@EricsonGomes这与MFC无关。大量的非MFC Windows应用程序承载ActiveX控件。那么大量的非MFC Windows应用程序会是什么呢?我需要一个root用户来学习在C++中开发Windows的任何方式,Ur@ ReMyLeBeAuto能给我一些光吗?ActiveX是一个很大的主题,关于它的大量信息在“新建项目向导”中启用ActiveX支持并不是严格要求的。您仍然可以将ActiveX控件添加到未启用此选项的项目中。它不表演任何魔法;它只是添加了代码。另外,通过C++的“代码”> IDISPUTS/<代码>接口调用ActiveX控件是ActiveX控件最不常用的用例。而且实现非常混乱。我的意思是,使用
L“Init”
字符串文本调用
MultiByteToWideChar
的基本原理是什么?或者是RAII包装纸和裸体的
变体的快乐混合?唉,对不起,我想,我之前告诉过你:我不正确。但我的具体实现细节在这里并不重要,只应该勾勒出前进的道路。这确实是我在VS 6或之前的历史非unicode源代码,经过修改以说明问题,但未进行优化。是的,在对话框中使用ActiveX控件是常见的用例,我试图用副词“经常”来表达。但我只是害怕吹毛求疵,说我的答案是垃圾,因为问题没有明确说明对话框中必须使用ActiveX,所以答案不够笼统,没有吹毛求疵的意思,使用C++中的ActiveX控件的<>代码> IDISPux</代码>接口是最不常用的用例。只需查询一个静态类型的接口,并将
IDispatch
madness的25多行压缩为一个调用。由编译器进行静态检查。我不知道这些和对话框有什么关系。在“新建项目向导”中启用ActiveX支持并不是严格要求的。您仍然可以将ActiveX控件添加到未启用此选项的项目中。它不表演任何魔法;它只是添加了代码。另外,通过C++的“代码”> IDISPUTS/<代码>接口调用ActiveX控件是ActiveX控件最不常用的用例。而且实现非常混乱。我的意思是,使用
L“Init”
字符串文本调用
MultiByteToWideChar
的基本原理是什么?或者是RAII包装纸和裸体的
变体的快乐混合?唉,对不起,我想,我之前告诉过你:我不正确。但我的具体实现细节在这里并不重要,只应该勾勒出前进的道路。这确实是我在VS 6或之前的历史非unicode源代码,经过修改以说明问题,但未进行优化。是的,在对话框中使用ActiveX控件是常见的用例,我试图用副词“经常”来表达。但我只是害怕吹毛求疵,说我的答案是垃圾,因为问题没有明确说明对话框中必须使用ActiveX,所以答案不够笼统,没有吹毛求疵的意思,使用C++中的ActiveX控件的<>代码> IDISPux</代码>接口是最不常用的用例。只需查询一个静态类型的接口,并将
IDispatch
madness的25多行压缩为一个调用。由编译器进行静态检查。我不知道这些和对话有什么关系。