【问题标题】:C++ Program crash on ApplyTheme methodApplyTheme方法上的C ++程序崩溃
【发布时间】:2014-03-08 01:26:56
【问题描述】:

我正在学习基于此示例代码的 C++ PowerPoint 自动化

http://code.msdn.microsoft.com/office/CppAutomatePowerPoint-024b696c/sourcecode?fileId=52793&pathId=1940694257

对我来说一切都很清楚,但是当我尝试将默认模板更改为保存在磁盘上的自定义模板时遇到了问题。我写了以下行:

AutoWrap(DISPATCH_METHOD, NULL, pPres, L"ApplyTheme", 1, L"D:\\template.thmx" ); 

这是从 VBA 复制的这条工作线:

Call pptPres.ApplyTheme("D:\template.thmx")

问题是应用程序在这条线上崩溃了。

编辑:

找到了问题(愚蠢的一个),但修复后程序仍然崩溃。

pPres 应该是 Presentation 的类型,而不是 Presentations(Presentation 的集合)。

现在问题出在 AutoWrap 函数的这一行(上面的链接中提供了完整代码)

// Make the call 
hr = pDisp->Invoke(dispID, IID_NULL, LOCALE_SYSTEM_DEFAULT, 
    autoType, &dp, pvResult, NULL, NULL); 

点击该行后,我在 mlock.c 中的 _unlock 中的 LeaveCriticalSection 上遇到未处理的异常和应用程序中断。

【问题讨论】:

  • 错误信息是什么?
  • 程序以代码 0 退出,没有任何错误消息。不知道有没有办法从该行获取错误码。
  • 我得到OLE错误码:0x80020006
  • 用VS中的错误查找工具,意思是:未知名称。我猜你应该为函数“ApplyTheme”传递一个内置模板的名称,而不是一个文件。
  • 尝试从以下位置应用内置主题时出现相同错误:C:\Program Files (x86)\Common Files\microsoft shared\THEMES12

标签: c++ com powerpoint ole office-automation


【解决方案1】:

从你给我们的例子来看,你不能将 wchar_t* 字符串作为你想要在 AutoWrap 中调用的函数参数传递,你需要将它打包为 BSTR 类型,它具有与 wchar_t* 不同的内存布局字符串,所以会导致崩溃。

正确的方法在你给我们的例子中:

    VARIANT x; 
    x.vt = VT_BSTR; 
    x.bstrVal = SysAllocString(L"All-In-One Code Framework"); 
    AutoWrap(DISPATCH_PROPERTYPUT, NULL, pTxtRange, L"Text", 1, x); 
    VariantClear(&x); 

【讨论】:

  • 已经试过了,结果一样。还尝试了 DISPATCH_PROPERTYPUT(在 VBA 中设置)和 DISPATCH_METHOD(在 VBA 中调用)
  • 函数“ApplyTheme”的返回类型是什么?无效?
  • 修复我的错误(我使用 Presentations 类型而不是 Presentation)并将字符串作为 BSTR 传递完美。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-28
相关资源
最近更新 更多