duilib中如何调用ocx里面的方法

simple 2019-03-26 05:23:02
如题,duilib中用了DSOFramer的ocx控件,已经显示出来了,但不知道如何去调用ocx里面的方法?
看到网上其他是这样子用的

CActiveXUI* pActiveXUI = static_cast<CActiveXUI*>(m_PaintManager.FindControl(_T("ActiveXDemo1")));
if (pActiveXUI)
{
IWebBrowser2* pWebBrowser = NULL;

pActiveXUI->SetDelayCreate(false); // 相当于界面设计器里的DelayCreate属性改为FALSE,在duilib自带的FlashDemo里可以看到此属性为TRUE
pActiveXUI->CreateControl(CLSID_WebBrowser); // 相当于界面设计器里的Clsid属性里填入{8856F961-340A-11D0-A96B-00C04FD705A2},建议用CLSID_WebBrowser,如果想看相应的值,请见<ExDisp.h>
pActiveXUI->GetControl(IID_IWebBrowser2, (void**)&pWebBrowser);

if (pWebBrowser != NULL)
{
//pWebBrowser->Navigate(L"https://code.google.com/p/duilib/",NULL,NULL,NULL,NULL);
pWebBrowser->Navigate(L"http://www.baidu.com/", NULL, NULL, NULL, NULL); // 由于谷歌时不时被墙,所以换成反应快的网站
pWebBrowser->Release();
}
}


我的用法是这样的,

CActiveXUI* pActiveXUI = static_cast<CActiveXUI*>(m_pm.FindControl(_T("ActiveXUI1")));
if( pActiveXUI )
{
CFramercontrol1 dsoFramer;
pActiveXUI->CreateControl(dsoFramer.GetClsid());
}


CFramercontrol1 *pFramer = NULL;
CActiveXUI* pActiveXUI = static_cast<CActiveXUI*>(m_pm.FindControl(_T("ActiveXUI1")));
if( pActiveXUI )
{
CFramercontrol1 dsoFramer;
IDispatch *pDispatch = NULL;
//pActiveXUI->GetControl(MIDL_INTERFACE("00460182-9E5E-11d5-B7C8-B8269041DD57"), (LPVOID*)&pFramer);
//pActiveXUI->GetControl(IID_IOleObject, (LPVOID*)&pFramer);
pActiveXUI->GetControl(IID_IDispatch, (LPVOID*)&pDispatch);
//pActiveXUI->GetControl(IID_IAsyncOperation, (LPVOID*)&pFramer);
//pFramer = reinterpret_cast<CFramercontrol1*>(pDispatch);
}
if (NULL != pFramer)
{
pFramer->put_Menubar(FALSE); // 崩溃
}
...全文
293 3 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
zgl7903 2019-03-27
  • 打赏
  • 举报
回复 1
引用 1 楼 simple 的回复:
通过研究发现,其需要找到ocx的接口类,而通过以下方法可以导出ocx的tlh文件,里面就存放了ocx的接口类 参考https://blog.csdn.net/muhuacat/article/details/48771967

#import "dsoframer.ocx" rename_namespace("dsoframer")  // 导出ocx的接口类,即.tlh文件,生成文件在中间目录
											           // rename_namespace里面的内容为接口类的命名空间
//#include "dsoframer.tlh"  // 不能与#import同时使用,否则会出现重定义
创建ActiveX的代码

	CActiveXUI* pActiveXUI = static_cast<CActiveXUI*>(m_pm.FindControl(_T("ActiveXUI1")));
	if( pActiveXUI ) 
	{
		// 必须注释掉#import语句,然后添加#include "dsoframer.tlh",否则会出现重定义
		// 不注释掉#import语句,则编译通过,但创建AcitveX的时候就会崩溃
 		//pActiveXUI->CreateControl(__uuidof(dsoframer::__DSOFramer));

		CLSID _clsid;
		CLSIDFromString(CComBSTR("{00460182-9E5E-11d5-B7C8-B8269041DD57}"), &_clsid);
		pActiveXUI->CreateControl(_clsid);
	}
使用方法

	CActiveXUI* pActiveXUI = static_cast<CActiveXUI*>(m_pm.FindControl(_T("ActiveXUI1")));
	if( pActiveXUI ) 
	{
		dsoframer::_FramerControl *pObject = NULL;
		HRESULT hr = pActiveXUI->GetControl(IID_IDispatch, (LPVOID*)&pObject);
		if (NULL != pObject)
		{
			pObject->put_Menubar(FALSE);
			pObject->LoadOriginalFile("C:\\Users\\User\\Desktop\\test.doc", "doc");
		}
	}
_船长_ 2019-03-27
  • 打赏
  • 举报
回复
duilib中OCX控件的支持简直就一菜逼,别跳这个坑了
simple 2019-03-27
  • 打赏
  • 举报
回复
通过研究发现,其需要找到ocx的接口类,而通过以下方法可以导出ocx的tlh文件,里面就存放了ocx的接口类
参考https://blog.csdn.net/muhuacat/article/details/48771967

#import "dsoframer.ocx" rename_namespace("dsoframer") // 导出ocx的接口类,即.tlh文件,生成文件在中间目录
// rename_namespace里面的内容为接口类的命名空间
//#include "dsoframer.tlh" // 不能与#import同时使用,否则会出现重定义


创建ActiveX的代码

CActiveXUI* pActiveXUI = static_cast<CActiveXUI*>(m_pm.FindControl(_T("ActiveXUI1")));
if( pActiveXUI )
{
// 必须注释掉#import语句,然后添加#include "dsoframer.tlh",否则会出现重定义
// 不注释掉#import语句,则编译通过,但创建AcitveX的时候就会崩溃
//pActiveXUI->CreateControl(__uuidof(dsoframer::__DSOFramer));

CLSID _clsid;
CLSIDFromString(CComBSTR("{00460182-9E5E-11d5-B7C8-B8269041DD57}"), &_clsid);
pActiveXUI->CreateControl(_clsid);
}


使用方法

CActiveXUI* pActiveXUI = static_cast<CActiveXUI*>(m_pm.FindControl(_T("ActiveXUI1")));
if( pActiveXUI )
{
dsoframer::_FramerControl *pObject = NULL;
HRESULT hr = pActiveXUI->GetControl(IID_IDispatch, (LPVOID*)&pObject);
if (NULL != pObject)
{
pObject->put_Menubar(FALSE);
pObject->LoadOriginalFile("C:\\Users\\User\\Desktop\\test.doc", "doc");
}
}

3,248

社区成员

发帖
与我相关
我的任务
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
  • ATL/ActiveX/COM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧