Word的IID没有找到?

青稞 2011-04-22 07:53:47

CLSID clsid;

if (::CLSIDFromProgID(L"Word.Application", &clsid) == S_OK)
{
IUnknown *unknown = NULL;

if (::GetActiveObject(clsid, NULL, &unknown) == S_OK)
{
_ApplicationPtr m_app;
if (unknown->QueryInterface(IID_IDispatch//这个IID怎么写?, (void **)m_app) == S_OK)
{
m_app->Visible = VARIANT_TRUE;//程序崩溃
m_docs = m_app->GetDocuments();

}
}
}
...全文
150 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
青稞 2011-04-24
  • 打赏
  • 举报
回复
OK,非常感谢您的帮助。
多谢,结帖。
青稞 2011-04-23
  • 打赏
  • 举报
回复
dream238.
你确定你这样写是OK的??
我的程序爆炸如故。。
ArcRain 2011-04-23
  • 打赏
  • 举报
回复
额...看了下接口,刚才回复的写错了,应该是m_app->put_Visible(VARIANT_TRUE)
ArcRain 2011-04-23
  • 打赏
  • 举报
回复
接口的Visible方法不能这么直接等的呀,C++里使用应该m_app->Visible(VARIANT_TRUE);
ArcRain 2011-04-23
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 fighttodeath 的回复:]

dream238非常感谢您的回答,按您所说,问题已解决。
由于网上有这种写法:
Word::_ApplicationPtr m_app;
m_app.CreateInstance(__uuidof(Word::Application)

所以我先前实验了这个unknown->QueryInterface(__uuidof(Word::Application), (void **)&am……
[/Quote]
关于这个区别我也没办法说出一个很好的答案,我大致GOOGLE了下,应该和Automation编程有关系,这方面我没接触过,所以不太清楚。至于我自己来写的话,我想我会按照COM接口的使用方法来进行编写,创建实例用标准的CoGetClassObject或者CoCreateInstance,当然,一个前提就是知道要使用接口的CLSID或者IID。
从你的例子来看,因为要使用的接口指针是_ApplicationPtr,所以其关联的接口就是_Application了。其他接口可以查询接口IDL定义或者头文件来看
青稞 2011-04-23
  • 打赏
  • 举报
回复
dream238非常感谢您的回答,按您所说,问题已解决。
由于网上有这种写法:
Word::_ApplicationPtr m_app;
m_app.CreateInstance(__uuidof(Word::Application)

所以我先前实验了这个unknown->QueryInterface(__uuidof(Word::Application), (void **)&m_app),但失败了。
而您的建议是unknown->QueryInterface(__uuidof(Word::_Application), (void **)&m_app)
这个Word::Application和Word::_Application有什么区别?
青稞 2011-04-23
  • 打赏
  • 举报
回复
这个是输入错误。
代码是对的:
if (unknown->QueryInterface(IID_IDispatch//这个IID怎么写?, (void **)&m_app) == S_OK)

Debug看了,m_app也是有值的,但就是过不了。。
ArcRain 2011-04-23
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 fighttodeath 的回复:]

dream238.
你确定你这样写是OK的??
我的程序爆炸如故。。
[/Quote]
不好意思,我又看漏了...你QueryInterface的IID填错了,不是IID_IDispatch,那样会得到IDispatch接口,应该是unknown->QueryInterface(__uuidof(_Application), (void **)&m_app),因为你的m_app是一个_Application的指针,所以你查询的IID必须匹配,这样才能保证得到接口的正确性。
飞翔的薄荷 2011-04-22
  • 打赏
  • 举报
回复
m_app->Visible = VARIANT_TRUE;//程序崩溃

感觉3楼说对了 调试一下看看m_app的值
ArcRain 2011-04-22
  • 打赏
  • 举报
回复
unknown->QueryInterface(IID_IDispatch, (void **)m_app)
m_app少了个&吧?
unknown->QueryInterface(IID_IDispatch, (void **)&m_app)
青稞 2011-04-22
  • 打赏
  • 举报
回复
感觉_ApplicationPtr m_app没有真的获取到接口对象。
有用智能指针处理过这个问题的同仁没有?

16,466

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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