gpt4 book ai didi

c++ - 显式 DLL 1 函数失败

转载 作者:行者123 更新时间:2023-11-30 03:28:21 25 4
gpt4 key购买 nike

我正在写下面的代码

#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); 它失败并给出以下错误

Run-Time Check Failure #0 - The value of ESP was not properly saved across a function call. This is usually a result of calling a function declared with one calling convention with a function pointer declared with a different calling convention.

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

我对 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

最佳答案

因为所有其他函数都不接受参数,所以我想 Decompress 函数的注释中提到的 CALLSPEC 与您使用的调用约定不同。

重新检查 Decompress 函数的调用约定和 typedef 的定义。

关于c++ - 显式 DLL 1 函数失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46687195/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com