2013-09-04 9 views
0

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을 반환하려고 할 때 오류가 발생합니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까?

+1

이 문제는 다른 호출 규칙이 사용 된 것으로 보입니다. DeviceManager :: initilzeAvailableDevices가 WINAPI 호출 규칙을 가지도록 정의 된 이유는 무엇입니까? 이 방법의 선언은 이것을 반영하지 않는다. 이게 정말 필요한가요? – pag3faul7

+0

[MSC 8.0 이상한 오류 : "ESP 값이 함수 호출을 통해 제대로 저장되지 않았습니다 ..."] (http : // stackoverflow.com/questions/142644/weird-msc-8-0-error-the-value-of-esp-was-well-saved-a-function) – sashoalm

+0

@ pag3faul7, 내가 발견 한 모든 방법으로 테스트를 실시했다. 이 오류를 고치기 위해 DeviceManager :: initilzeAvailableDevices에 WINAPI를 추가 한 이유는 무엇입니까? 여전히이 문제가 없어도 동일한 문제가 있습니다. –

답변

1

이 문제를 해결하는 방법을 마침내 발견했습니다.

오른쪽, 구성 속성로 이동, 속성을 선택하여 프로젝트 클릭 C/C++ 선택한 다음 코드 생성을 선택합니다.

변경 기본 런타임 검사 ~ Default을 확인하십시오.

변경 구조체 멤버 얼라이언스 to 1 Byte (/Zp1).

나는이 작품이 여러분에게도 정말 희망이됩니다.

최고 감사합니다

+0

나는이 문제에 대한 해결책을 매우 의심합니다. 언급 한 "기본 런타임 검사"는 디버그 모드에서만 켜져 있습니다. 그래서 당신이 거기에서 한 것은 릴리스 모드에서 실행하고 디버그 주장을 무시하는 것과 같습니다. 릴리스 모드에서 코드가 덜 명확한 장소에서 충돌 할 수 있습니다. – Benj

관련 문제