显式DLL 1函数失败

时间:2017-10-11 11:32:35

标签: c++ winapi

我正在编写以下代码

#include "SwiWrapper.h"
#include <windows.h>


HINSTANCE hDLL;


SwiWrapper::SwiWrapper()
{

}


SwiWrapper::~SwiWrapper()
{
}

bool SwiWrapper::Initialize()
{          // Handle to DLL  
    hDLL = LoadLibrary("SWI32.dll");
    return true;
}

void SwiWrapper::CloseDll()
{
    FreeLibrary(hDLL);
}


//WiRawImage* CALLSPEC WiCreateRawImage ARGSPEC((void));
typedef WiRawImage*(*FuncWiCreateRawImage) (void);
WiRawImage * SwiWrapper::WiCreateRawImage()
{
    FuncWiCreateRawImage Exec = (FuncWiCreateRawImage)GetProcAddress(hDLL, "WiCreateRawImage");
    return Exec();
}

//WiCmpImage* CALLSPEC WiCreateCmpImage ARGSPEC((void));
typedef WiCmpImage*(*FuncWiCreateCmpImage) (void);
WiCmpImage * SwiWrapper::WiCreateCmpImage()
{
    FuncWiCreateCmpImage Exec = (FuncWiCreateCmpImage)GetProcAddress(hDLL, "WiCreateCmpImage");
    return Exec();
}

//  WiDecmpOptions* CALLSPEC WiCreateDecmpOptions ARGSPEC((void));
typedef WiDecmpOptions*(*FuncWiCreateDecmpOptions) (void);
WiDecmpOptions * SwiWrapper::WiCreateDecmpOptions()
{
    FuncWiCreateDecmpOptions Exec = (FuncWiCreateDecmpOptions)GetProcAddress(hDLL, "WiCreateDecmpOptions");
    return Exec();
}


//int CALLSPEC WiDecompress ARGSPEC((   WiDecmpOptions    *DecmpOptions,    WiRawImage        *RawImage,    WiCmpImage        *CmpImage ));
typedef int(*WiDecompressFunc) (WiDecmpOptions*, WiRawImage*, WiCmpImage*);
int SwiWrapper::WiDecompress(WiDecmpOptions * DecmpOptions, WiRawImage * RawImage, WiCmpImage * CmpImage)
{
    WiDecompressFunc Exec = (WiDecompressFunc)GetProcAddress(hDLL, "WiDecompress");
    int  result = Exec(DecmpOptions, RawImage, CmpImage);
    return 0;
}

我正在使用它

SwiWrapper *wrapper = new SwiWrapper();


if (initialized)
{
    image = wrapper->WiCreateRawImage();
    cmpImage = wrapper->WiCreateCmpImage();
    decmpOpts = wrapper->WiCreateDecmpOptions();

    GetCmpImage(cmpImage, "path\\data.bin");

    SetDecompressionOptions(decmpOpts);

    wrapper->WiDecompress(decmpOpts, image, cmpImage); //This line is failing

    FileImage("path\\data.jpg", image);

    wrapper->CloseDll();
}

但是,当我到达以下行wrapper->WiDecompress(decmpOpts, image, cmpImage);时,它会失败并出现以下错误

  

运行时检查失败#0 - 未正确保存ESP的值   跨函数调用。这通常是调用a的结果   用一个带有函数指针的调用约定声明的函数   用不同的调用约定声明。

我认为我搞砸了参数,但我不确定我做错了什么。我有头文件来了解输入和输出。

我不熟悉C ++,最近也没有,所以我的搜索并没有让我得到一个有效的答案,虽然我在错误上找到了一些 Stackoverflow 解决方案,但我无法弄清楚我需要改变什么

我在swi32.dll上的所有内容都在此Dropbox链接中的此rar文件中 https://www.dropbox.com/s/2bfhylzb2evrggp/Lib.rar?dl=0

我的完整源代码位于以下链接中 https://www.dropbox.com/s/jkxfyt6xjeanvng/ConsoleApplication1.rar?dl=0

2 个答案:

答案 0 :(得分:2)

因为所有其他函数都没有参数,我认为解压缩函数的注释中提到的CALLSPEC与您使用的调用约定不同。

重新检查调用约定和解压缩函数的typedef定义。

答案 1 :(得分:0)

我已经设法通过更改

来实现它

这一行

typedef int(*WiDecompressFunc) (WiDecmpOptions*, WiRawImage*, WiCmpImage*);

到这一行

typedef int(__stdcall *WiDecompressFunc)(WiDecmpOptions * DecmpOptions, WiRawImage * RawImage, WiCmpImage * CmpImage);

致记:

@Mgetz,@ HansPassant谁指出使用__stdcall以及链接如何使用