atl实现word插件的问题,如何在word中插入activex控件并调用其方法?

talkingmute 2009-02-28 03:56:19
本人最近在做word插件相关开发,按照网上的一些例子,用atl实现,在word中添加了自定义的按钮,现在想在触发按钮的点击事件时插入一个activex控件,并调用activex控件中的方法。activex控件是用mfc开发的,里面提供有一个方法:BSTR SetupMon(LPCTSTR Data);

目前插入activex控件的已经实现,就是不知如何调用它的方法,相关代码如下:

void __stdcall CMyAddin::OnClickButton1(IDispatch * /*Office::_CommandBarButton**/ Ctrl,VARIANT_BOOL * CancelDefault)
{
CComQIPtr <Office::_CommandBarButton> spBtn1(Ctrl);
CComQIPtr <Word::_Application> spApp;
CComQIPtr <Word::_Document> spDoc;
CComQIPtr <Word::InlineShapes> spInS;
CComVariant vtClassType;
CComBSTR bsClassType("MYOCX.MyocxCtrl.1");

vtClassType=bsClassType;
spApp=spBtn1->GetApplication();
spDoc=spApp->GetActiveDocument();
spInS=spDoc->GetInlineShapes();
spInS->AddOLEControl(&vtClassType);//通过AddOLEControl方法已将myocx这个activex控件加入到word中

//下面该如何调用activex控件中的SetupMon方法?

}

希望大家给予帮助,万分感谢!!
...全文
801 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
qianplaypn 2011-08-15
  • 打赏
  • 举报
回复
CComVariant vtClassType;
CComBSTR bsClassType("MYOCX.MyocxCtrl.1");

vtClassType=bsClassType;
spInS->AddOLEControl(&vtClassType);//通过AddOLEControl方法已将myocx这个activex控件加入到word中


请问CComBSTR bsClassType("MYOCX.MyocxCtrl.1");是怎么写的,就是说怎么写调

用自己做的ACTIVEX控件的 bsClassType呢。 最近被这个小纠结了一下,有空能不能指点指点~谢谢
senlinlicw 2010-06-01
  • 打赏
  • 举报
回复
怎么弄的呀,能详细说下吗,我也正在弄这块东西。
shukinwg 2009-03-27
  • 打赏
  • 举报
回复
找到这个控件的窗口句柄最简单的方法是:
GetCursorPos(&m_LBDownPoint);//记录鼠标点击时的坐标。
m_hActiveXWnd=WindowFromPoint(m_LBDownPoint);
不知是不是楼主要控件窗口的句柄?
wwwxxb40000 2009-03-14
  • 打赏
  • 举报
回复

学习
talkingmute 2009-03-04
  • 打赏
  • 举报
回复
谢谢上边几位朋友!!查找activex控件的已实现,还是跟插入时一样,通过GetOleFormat.GetObject。

最后一个问题,如何能使这个插入的activex控件是悬浮状态呢,就是悬浮在word文件上面,而且支持拖动呢,可以随意挪动它的位置???

talkingmute 2009-03-03
  • 打赏
  • 举报
回复
用activex控件方法的已经解决,在工程中导入activex库及声明即可。

现在又有一个新问题,就是如何在当前word文件中找到这个插入的activex控件呢,activex控件是用AddOLEControl方法插入的,希望能再指导下,谢谢!
蒋晟 2009-03-03
  • 打赏
  • 举报
回复
queryinterface IOleObject getclassid
talkingmute 2009-03-03
  • 打赏
  • 举报
回复
请问Que ryInterface该如何写啊,大侠给指导下啊,
我这样写还是提示错误。
spInS->QueryInterface(__uuidof(_DMyocx), (void**)&pocx);
if(pocx)
pocx->SetupMon(...);
else
{
MessageBox(NULL,_T("QueryInterface"),_T("ERROR"),MB_OK);
return;
}
oyljerry 2009-03-03
  • 打赏
  • 举报
回复
查看返回错误的号码值等,GetLastError
talkingmute 2009-03-03
  • 打赏
  • 举报
回复
MyocxCtrl *pocx=NULL;
HRESULT hInit;

CoInitialize(NULL);

hInit=::CoCreateInstance(__uuidof(_DMyocx),
NULL,
CLSCTX_INPROC_SERVER,
__uuidof(_DMyocx),
(void**)&pocx);

if(FAILED(hInit))
{
//这里总是错误,通过CoCreateInstance方法不可以吗?
MessageBox(NULL,_T("CoCreateInstance"),_T("ERROR"),MB_OK);
return;
}

if(pocx)
{
pocx->SetupMon(...);
}
jameshooo 2009-03-03
  • 打赏
  • 举报
回复
通过InlineShapes枚举,一个一个尝试查询控件接口,能成功的就是你要的。
talkingmute 2009-03-02
  • 打赏
  • 举报
回复
to:jiangsheng

按照您的说明加了如下代码,不知下面该如何写,怎么调用其中的SetupMon方法。。。

IDispatch *pFun;
spShape->get_OLEFormat(&spFormat);
spFormat->get_Object(&pFun);
talkingmute 2009-03-02
  • 打赏
  • 举报
回复
to:jameshooo

请问用QueryInterface查询控件接口该怎么弄?我看Ixxx* pCtrl = NULL; 这里,activex控件是要基于IDispatch的,而我的那个MyocxCtrl是基于COleControl的,就是class CMyocxCtrl : public COleControl这样的,该如何写,并调用其中的SetupMon方法。。。

本人初学com这块,比较菜,希望大侠给予指导!
蒋晟 2009-02-28
  • 打赏
  • 举报
回复
GetOleFormat.GetObject
http://topic.csdn.net/t/20040623/15/3116571.html
jameshooo 2009-02-28
  • 打赏
  • 举报
回复
直接从InlineShape查询控件接口呢?
Ixxx* pCtrl = NULL;
spShape->QueryInterface(IID_Ixxx, (void**)&pCtrl);
talkingmute 2009-02-28
  • 打赏
  • 举报
回复
谢谢回复,按照您说的加了如下代码,不过不行。

CComQIPtr <Word::InlineShape> spShape;
CComQIPtr <Word::OLEFormat> spFormat;

spShape=spInS->AddOLEControl(&vtClassType);
spShape->get_OLEFormat(&spFormat);
spFormat->get_Automation...
//错误,OLEFormat对象下没有get_Automation方法的。
jameshooo 2009-02-28
  • 打赏
  • 举报
回复
AddOLEControl应该返回一个InlineShape指针,直接查询控件接口试试,如果查不出来,再试试下面的(不敢肯定):

spIns->AddOLEControl --> InlineShape
InlineShape::get_OLEFormat --> OLEFormat
OLEFormat::get_Automation --> IDispatch
IDispatch::QueryInterface

3,245

社区成员

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

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