2014-02-10 151 views
0

我在学习这个示例代码C++程序崩溃

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

一切看起来都清楚地知道C++的PowerPoint自动化筑底,但我有,当我试图改变默认的问题我的自定义模板保存在磁盘上的模板。我写了下面一行:

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

这是VBA这个工作线的再现:

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

的问题是,应用程序在该行崩溃。

编辑:

发现问题(笨一个),但将其固定后,仍然程序崩溃。

pPres应该是演示文稿类型,而不是演示文稿(它是演示文稿的集合)。现在

的问题是在这条线在AutoWrap功能(全码在上面的链接提供)

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

创下该行我得到未处理的异常和应用程式的空档上LeaveCriticalSection在_unlock在mlock.c后。

+0

什么是错误讯息? – Matt

+0

程序以代码0退出,没有任何错误消息。我不知道是否有任何方法从该行获取错误代码。 –

+0

我已经获得OLE错误代码:0x80020006 –

回答

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); 
+0

已经尝试过,结果相同。还尝试过DISPATCH_PROPERTYPUT(在VBA中设置)和DISPATCH_METHOD(在VBA中调用) –

+0

函数“ApplyTheme”的返回类型是什么?作废? – Matt

+0

修复我的错误(我用演示文稿类型而不是演示文稿)和传递字符串作为BSTR完美工作。谢谢 –