我使用QT创建了一个.dll文件,然后将其加载到我的应用程序中。当它即将从一个函数返回时,我会收到:
ESP的值未在函数调用中正确保存
我从DLL项目开始:
这是我的device_manager_interface.hpp:
#ifndef __DEVICE_MANAGER_INTERFACE_HPP__
#define __DEVICE_MANAGER_INTERFACE_HPP__
#include <QtCore>
class DeviceManagerInterface
{
public:
virtual BCR * getDeviceBCR() = 0 ;
.
.
.
};
QT_BEGIN_NAMESPACE
Q_DECLARE_INTERFACE(DeviceManagerInterface,"some_info");
QT_END_NAMESPACE
#endif //__DEVICE_MANAGER_INTERFACE_HPP__
这是我的device_manager.hpp:
#ifndef __DEVICE_MANAGER_BASE_HPP__
#define __DEVICE_MANAGER_BASE_HPP__
#include "device_manager_interface.hpp"
class DeviceManager : public DeviceManagerInterface
{
public:
DeviceManager();
virtual BCR * getDeviceBCR();
.
.
.
protected:
virtual void initilzeAvailableDevices(DeviceList device_list);
virtual WORD startup();
.
.
.
};
#endif //__DEVICE_MANAGER_BASE_HPP__
这是我的device_manager.cpp:
#include "device_manager.hpp"
DeviceManager::DeviceManager()
{
}
void WINAPI DeviceManager::initilzeAvailableDevices(DeviceList device_list)
{
WORD wfs_version = startup();
.
.
.
}
WORD DeviceManager::startup()
{
WFSVERSION wfs_version;
HRESULT hRes;
hRes = WFSStartUp(SUPPORTED_VERSIONS, &wfs_version);
WORD version = wfs_version.wVersion;
return version;
}
WFSStartUp是包含在xfsapi.h
中的函数,并且定义如下。
HRESULT extern WINAPI WFSStartUp ( DWORD dwVersionsRequired, LPWFSVERSION lpWFSVersion);
这是我的device_manager_impl.hpp:
#ifndef __DEVICE_MANAGER_WINCORE_HPP__
#define __DEVICE_MANAGER_WINCORE_HPP__
#include "device_manager.hpp"
class DeviceManagerImpl : public QObject, DeviceManager
{
Q_OBJECT
Q_INTERFACES(DeviceManagerInterface)
public:
DeviceManagerImpl();
protected:
.
.
.
};
#endif //__DEVICE_MANAGER_WINCORE_HPP__
这是我的device_manager_impl.cpp:
#include "device_manager_impl.hpp"
#include "xfsapi.h"
#define BRAND_NAME "WINCORE"
DeviceManagerImpl::DeviceManagerImpl()
{
m_brand_name = BRAND_NAME;
fill_map_logical_names();
DeviceList device_list = detectAvailableDevices();
DeviceManager::initilzeAvailableDevices(device_list);
}
Q_EXPORT_PLUGIN2(device_manager_impl, DeviceManagerImpl);
此项目提供名为WINCORE.dll的DLL文件。
这就是我加载这个.dll:
的方法QPluginLoader* pluginLoader = new QPluginLoader(filename);
QObject *plugin = pluginLoader->instance();
filename
包含WINCORE.dll路径,它是正确的。我的问题是startup()
类DeviceManager
。当它想要返回version
时,我收到错误。我做错了什么?
答案 0 :(得分:2)
我终于找到了解决这个问题的方法!
右键点击项目,选择属性,转到配置属性,选择 C / C ++ 然后选择代码生成。
将基本运行时检查更改为Default
。
将结构成员联盟更改为1 Byte (/Zp1)
。
我真的希望这对你们有用。
最好的问候