Winapi 是否可以将activeX控件与win32应用程序一起使用?
我正在用MFC共享DLL编写我的Win32应用程序,我试图在其上使用ActiveX控件,这可能吗?或者我只是在浪费时间?创建新的MFC项目时,请确保激活ActiveX支持(例如使用VS2008): 通常,您希望在对话框窗口中使用ActiveX控件。右键单击designer视图中的对话框,选择“插入ActiveX控件”,然后选择所需的ActiveX: 如果您想在对话框外部自由嵌入ActiveX控件,那么MFC有一个ATL包装器。但这有点棘手,看起来像这样: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
#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多行压缩为一个调用。由编译器进行静态检查。我不知道这些和对话有什么关系。