C++ 程序在应用主题方法上崩溃

C++ Program crash on ApplyTheme method

本文关键字:方法 崩溃 程序 应用 C++      更新时间:2023-10-16

我正在学习基于此示例代码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 应该是演示文稿的类型,而不是演示文稿(演示文稿的集合)。

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

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

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

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