QT로 .dll 파일을 만들었고 응용 프로그램에로드했습니다. 하나의 함수에서 반환하려고 때, 나는 나타납니다함수 호출 오류에서 ESP 값이 제대로 저장되지 않았습니다
The value of ESP was not properly saved across a function call
은 내가 DLL 프로젝트를 시작합니다
#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 :
이 내 device_manager_interface.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
에 포함되어 있으며 이와 같이 정의 된 기능입니다.
#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 파일을 제공합니다 :
#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입니다 :
HRESULT extern WINAPI WFSStartUp (DWORD dwVersionsRequired, LPWFSVERSION lpWFSVersion);
이
내 device_manager_impl.hpp입니다.이 내가이 .DLL로드하는 방법입니다
QPluginLoader* pluginLoader = new QPluginLoader(filename);
QObject *plugin = pluginLoader->instance();
filename
는 WINCORE.dll 경로를 포함하고 그것은 맞습니다. 제 문제는 DeviceManager
클래스의 startup()
입니다. version
을 반환하려고 할 때 오류가 발생합니다. 내가 도대체 뭘 잘못하고있는 겁니까?
이 문제는 다른 호출 규칙이 사용 된 것으로 보입니다. DeviceManager :: initilzeAvailableDevices가 WINAPI 호출 규칙을 가지도록 정의 된 이유는 무엇입니까? 이 방법의 선언은 이것을 반영하지 않는다. 이게 정말 필요한가요? – pag3faul7
[MSC 8.0 이상한 오류 : "ESP 값이 함수 호출을 통해 제대로 저장되지 않았습니다 ..."] (http : // stackoverflow.com/questions/142644/weird-msc-8-0-error-the-value-of-esp-was-well-saved-a-function) – sashoalm
@ pag3faul7, 내가 발견 한 모든 방법으로 테스트를 실시했다. 이 오류를 고치기 위해 DeviceManager :: initilzeAvailableDevices에 WINAPI를 추가 한 이유는 무엇입니까? 여전히이 문제가 없어도 동일한 문제가 있습니다. –