0

QT で .dll ファイルを作成し、アプリケーションにロードしました。1 つの関数から戻ろうとすると、次のメッセージが表示されます。

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、このように定義された in を含む関数です。

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();

にはfilenameWINCORE.dllパスが含まれており、正しいです。私の問題はstartup()クラスにありDeviceManagerます。戻りたいときにversion、エラーが発生します。私は何を間違っていますか?

4

1 に答える 1

2

私はついにこの問題を解決する方法を見つけました!

Projectを右クリックし、 Properties を選択し、 Configuration Properties移動し、C/C++ を選択してからCode Generationを選択します。

Basic Run Time Checkを に変更しDefaultます。

構成メンバー アライアンスを に変更し1 Byte (/Zp1)ます。

これが皆さんにとってもうまくいくことを本当に願っています。

よろしくお願いします

于 2013-09-07T06:28:34.807 に答える