几天前,出于安全考虑,我公司将操作系统从Windows XP更改为Windows 7(32位)。
我在VS 2008,QT 4.8.1和Boost中使用C ++。我的应用程序中的结构成员对齐是1个字节(/ Zp1)。
更改后,我发现了一个错误:
我加载使用的库QPluginLoader
,然后将qobject_cast
其强制转换为接口。在我的库中,我可能会加载另一个。
更改操作系统后,当我在调试模式下测试应用程序时,一切正常。一切都按预期进行,然后将其更改为Release,我的应用程序开始崩溃。
当我用VS 2008调试它时,我看到了此错误:
my_app.exe中发生缓冲区溢出,已损坏程序的内部状态。按Break调试程序,或按Continue终止程序。
有关更多详细信息,请参见帮助主题“如何调试缓冲区溢出问题”。
该应用程序在Windows XP(发行和调试模式)上仍然可以正常运行。
一开始,我以为是因为依赖或我错过了某些东西。经过几个小时的测试,并以发布模式登录来跟踪我的应用程序,我终于找到了问题所在。当一种方法试图将值(任何值)返回给在库中调用它的另一个方法时,我的应用程序崩溃。
例如:
方法B返回Bool,我在方法A中调用它。当方法B完成并准备将Bool值返回给方法A时,应用程序崩溃。如果要返回加载库的方法(如果该方法返回值),也会崩溃。不知何故,可以使用不返回任何值(无效)的方法。
为了确定到底出了什么问题,我在方法中的代码创建了另一个应用程序(测试器),并开始逐部分添加代码以查找错误。我相信这与QT有关。
请检查以下代码,并告诉我您是否知道错误所在。
我有main.cpp加载这样的插件:
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QString filename = "correct path";
QPluginLoader* pluginLoader = new QPluginLoader(filename);
QObject *plugin = pluginLoader->instance();
PluginInterface* plugin_instance;
if (plugin)
{
SecureZeroMemory(&plugin_instance, sizeof(PluginInterface));
plugin_instance = qobject_cast<PluginInterface *>(plugin);
}
bool result = plugin_instance->initialize();
return a.exec();
}
这是我的界面:
class PluginInterface
{
public:
virtual bool initialize() = 0;
};
QT_BEGIN_NAMESPACE
Q_DECLARE_INTERFACE(PluginInterface,"some text");
QT_END_NAMESPACE
我使我的图书馆像这样:
plugin.hpp
class Plugin : public QObject, public PluginInterface
{
Q_OBJECT
Q_INTERFACES(PluginInterface)
public:
Plugin();
bool initialize();
};
plugin.cpp
#define SUPPORTED_VERSIONS 0x01011403
#define WFS_TRACE_NONE 0
bool Plugin::initialize()
{
WFSVERSION wfs_version;
HRESULT hRes;
cout << "WFSStartUp" << endl;
hRes = WFSStartUp(SUPPORTED_VERSIONS, &wfs_version);
WORD version = wfs_version.wVersion;
cout << "version : " << version << endl;
DWORD dwTrace = WFS_TRACE_NONE;
cout << "WFSCreateAppHandle" << endl;
HRESULT hRes2;
HANDLE app_handle;
hRes2 = WFSCreateAppHandle(&app_handle);
cout << "Result : " << hRes2 << endl;
return true;
}
Q_EXPORT_PLUGIN2(my_plugin, Plugin);
这是我的测试器应用程序的输出:
WFSStartUp
版本:63424
WFSCreateAppHandle
结果:0
应用程序崩溃!
里面的代码Plugin::initialize()
工作正常。我将其复制/粘贴到main()
并运行该应用程序以确保对其进行确定。
怎么了 我想念什么?
我不得不更改一些Visual Studio构建选项来解决此问题!
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句