c++优化破OLE自动化程序(非mfc)
C++ Optimization breaking OLE Automation program (non-MFC)
我正在编写一个程序来解析Word文档并使用OLE自动化(我猜是非mfc方式)将数据导出到Excel工作簿。在调试中工作良好,在发布中不是这样(特别是如果启用了优化)。错误是IDispatch::Invoke调用失败,特别是:
0x80020004 DISP_E_PARAMNOTFOUND Parameter not found
我检查了StackOverflow的一些建议,主要的似乎是未初始化的变量。可能就是这样,但我还是不明白这个具体的例子。我把它缩小到我的程序Automation::Dispatch::Invoke
中的一个函数,它负责最终调用IDispatch::Invoke
。传入Automation::Dispatch::Invoke
的参数是正确的,所以问题是在其代码的某个地方。
查看我改编的基础代码(来自MSDN),我能够让它工作并缩小确切的问题线。下面显示的代码不工作,但注释指出了我移动使其工作的行(查找带有<--- Problem line
注释的2行)。在调试模式下,这一行的位置无关紧要,它在任何位置都可以工作。
我的问题是这修复了什么,为什么它是一个问题开始?谢谢你,如果我能使问题更清楚,请告诉我。
HRESULT Automation::Dispatch::Invoke(int cmd, std::string name, std::vector<VARIANT> values)
{
USES_CONVERSION;
HRESULT result;
/* Get DISPID for name passed */
DISPID dispID;
LPOLESTR nameOle=A2OLE(name.c_str());
result=pObjectInt->GetIDsOfNames(IID_NULL, &nameOle, 1, LOCALE_USER_DEFAULT, &dispID);
if (FAILED(result)) {
return result;
}
/* Reverse elements in values vector so they are invoked in the correct order */
std::reverse(values.begin(), values.end());
/* Allocate memory for object values */
VARIANT *pValues=new VARIANT[values.size() + 1];
for (unsigned int i=0; i < values.size(); ++i) {
pValues[i]=values[i];
}
/* Build DISPPARAMS */
DISPPARAMS dispParams= {NULL, NULL, 0, 0};
/* DISPID dispidNamed=DISPID_PROPERTYPUT; <--- PROBLEM LINE moved here makes it work */
dispParams.cArgs=values.size();
dispParams.rgvarg=pValues;
/* Handle special-case for property-puts */
if (cmd==DISPATCH_PROPERTYPUT) {
DISPID dispidNamed=DISPID_PROPERTYPUT; /* <--- PROBLEM LINE here */
dispParams.cNamedArgs=1;
dispParams.rgdispidNamedArgs=&dispidNamed;
}
/* Make the call */
if (cmd==DISPATCH_METHOD || cmd==DISPATCH_PROPERTYPUT) {
result=pObjectInt->Invoke(dispID, IID_NULL, LOCALE_SYSTEM_DEFAULT, cmd, &dispParams, NULL, NULL, NULL);
}
else {
VariantInit(&objectData);
result=pObjectInt->Invoke(dispID, IID_NULL, LOCALE_SYSTEM_DEFAULT, cmd, &dispParams, &objectData, NULL, NULL);
}
delete[] pValues;
return result;
}
在此代码中:
if (cmd==DISPATCH_PROPERTYPUT) {
DISPID dispidNamed=DISPID_PROPERTYPUT; /* <--- PROBLEM LINE here */
dispParams.cNamedArgs=1;
dispParams.rgdispidNamedArgs=&dispidNamed;
}
dispidNamed
是它所在代码块(即由{
}
分隔的区域)的局部变量。
到达}
后,它就不存在了。那么rgdispidNamedArgs
是一个悬空指针,因为它不再指向一个存在的变量。
在调试模式下,你很不幸,它没有更快地触发一个错误。
相关文章:
- 在 1 个服务器 n 客户端套接字 C++ MFC 应用程序中更新数据的客户端
- 如何在 MFC 应用程序中启动 ZeroMQ 线程?
- 视窗 10 :笔(手写笔)在 MFC 应用程序上不起作用
- 从 MFC C++ 6.0 应用程序迁移到 VS 2005
- C++ - 从 MFC 应用程序启动记事本,并将其默认标题从 "Untitled - Notepad" 更改为其他内容
- 如何创建一个可以在GUI对话模式下或通过命令行启动的C MFC程序
- 发送和将消息从一个类发送到另一堂课的问题.MFC程序
- DLL中的CImage析构函数会阻塞整个MFC程序
- 字体在Windows 8上变小 - 在C++/MFC程序中.如何避免这种情况
- MyTest1.exe 在 C++ / MFC 程序中触发了删除命令的断点
- MFC 程序崩溃时调整窗口大小并出现错误"A required resource was not found."
- OnPaint() 和 MouseMove 事件同时在 MFC C++程序中
- 如何在VS 2013上运行旧的mfc程序
- 检测控制台mfc程序中的转义键
- 从MFC程序卸载dll文件
- 在MFC程序中创建挂钩窗口
- 如何从c++ /MFC程序中获得控制台窗口
- 用vs2012在windows xp上编译MFC程序
- 在Linux上运行MFC程序
- MFC 程序挂起:在 Vista 上更新KB3059317后损坏的 Comctl32.dll