ApplyTheme方法的C ++程序崩溃

时间:2014-02-10 15:58:28

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

我正在学习基于此示例代码的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上得到未处理的异常和应用程序中断。

1 个答案:

答案 0 :(得分:0)

从您给出的示例中,您不能将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);