C++ 函数调用错误期间ESP的值未正确保存

C++ 函数调用错误期间ESP的值未正确保存,c++,qt,dll,dllimport,dllexport,C++,Qt,Dll,Dllimport,Dllexport,我用QT创建了一个.dll文件,并将其加载到我的应用程序中。当它即将从一个函数返回时,我收到: 函数调用中未正确保存ESP的值 我从DLL项目开始: 这是我的设备管理器界面.hpp: #ifndef __DEVICE_MANAGER_INTERFACE_HPP__ #define __DEVICE_MANAGER_INTERFACE_HPP__ #include <QtCore> class DeviceManagerInterface { public: virtual

我用QT创建了一个.dll文件,并将其加载到我的应用程序中。当它即将从一个函数返回时,我收到:

函数调用中未正确保存ESP的值

我从DLL项目开始:

这是我的设备管理器界面.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__
这是我的设备\u 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);
这是我的设备管理器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__
这是我的设备管理器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();

文件名
包含WINCORE.dll路径,且路径正确。我的问题是
DeviceManager
类中的
startup()
。当它想要返回
version
时,我得到了错误。我做错了什么?

我终于找到了解决这个问题的方法

右键单击您的项目,选择属性,转到配置属性,选择C/C++,然后选择代码生成

将基本运行时检查更改为默认值

将结构成员联盟更改为
1字节(/Zp1)

我真的希望这对你们也有用


最诚挚的问候

这个问题似乎是由于使用了不同的呼叫约定造成的。为什么要将DeviceManager::initilzeAvailableDevices定义为具有WINAPI调用约定。方法的声明没有反映这一点。这真的有必要吗?可能是@pag3faul7的复制品,我一直在测试以修复此错误,这就是为什么我将WINAPI添加到DeviceManager::initilzeAvailableDevices中,即使没有WINAPI,我仍然有相同的问题,我非常怀疑这是您问题的解决方案。您提到的“基本运行时检查”仅在调试模式下启用。因此,您在那里所做的相当于简单地在发布模式下运行并忽略调试断言。在发布模式下,您的代码可能会在不太明显的地方崩溃。
QPluginLoader* pluginLoader = new QPluginLoader(filename);

QObject *plugin = pluginLoader->instance();