C++ &引用;运行时检查失败“0-ESP的值”;调用dll函数时

C++ &引用;运行时检查失败“0-ESP的值”;调用dll函数时,c++,winapi,dll,C++,Winapi,Dll,我有一个带有lib.h的dll: #pragma once #ifdef EXPORTS #define API __declspec(dllexport) #else #define API __declspec(dllimport) #endif extern "C" API void test1(std::vector<ValueType*>* functions); #pragma一次 #ifdef导出 #定义API_uudeclspec(dllexport) #否则

我有一个带有lib.h的dll:

#pragma once

#ifdef EXPORTS
#define API __declspec(dllexport)
#else
#define API __declspec(dllimport)
#endif

extern "C" API void test1(std::vector<ValueType*>* functions);
#pragma一次
#ifdef导出
#定义API_uudeclspec(dllexport)
#否则
#定义API_udeclspec(dllimport)
#恩迪夫
外部“C”API void test1(std::vector*函数);
和lib.cpp:

#include "pch.h"
#include <iostream>
#include <vector>

#include "ValueType.h"
#include "NumberValue.h"

#include "TestLib.h"

void test1(std::vector<ValueType*>* functions) {
    functions->push_back(new NumberValue(123321));
#包括“pch.h”
#包括
#包括
#包括“ValueType.h”
#包括“NumberValue.h”
#包括“TestLib.h”
void test1(std::vector*函数){
函数->推回(新数字值(123321));
使用此dll的主文件是:

#include <iostream>
#include <vector>
#include <Windows.h>


#include "ValueType.h"


using namespace std;


typedef void (WINAPI* importedInitFunction)(std::vector<ValueType*>*);
importedInitFunction test1F;

std::vector<ValueType*> values;


int main() {
    while (1) {
        HMODULE lib = LoadLibrary("DllTest1.dll");


        test1F = (importedInitFunction)GetProcAddress(lib, "test1");

        test1F(&values);
        test1F(&values);

        std::cout << values.at(0)->asString();

        FreeLibrary(lib);
        system("pause");
    }
    return 0;
}
#包括
#包括
#包括
#包括“ValueType.h”
使用名称空间std;
typedef void(WINAPI*importedInitFunction)(std::vector*);
导入初始化函数test1F;
std::向量值;
int main(){
而(1){
HMODULE lib=LoadLibrary(“DllTest1.dll”);
test1F=(importedInitFunction)GetProcAddress(lib,“test1”);
test1F(和值);
test1F(和值);
std::cout asString();
免费图书馆;
系统(“暂停”);
}
返回0;
}
当我试图编译代码时,在“test1F(&values);”行发现错误:“运行时检查失败#0-未在函数调用中正确保存ESP的值。”


如何修复它?

问题在于,在主程序中,您声明了扩展到的函数指针
WINAPI
,但默认调用约定(DLL使用)是


调用约定不匹配是导致问题的原因。要解决此问题,请删除
WINAPI
宏,或使DLL函数也
WINAPI

问题在于,在主程序中,您声明了扩展为的函数指针
WINAPI
,但扩展为默认调用约定(由DLL使用)是


调用约定不匹配是导致问题的原因。要解决此问题,请删除
WINAPI
宏,或使DLL函数也
WINAPI

与问题无关,但几乎没有任何理由使用指向容器的指针。函数指针声明中的WINAPI是错误的,这是
\uCDECL
函数。堆栈变得不平衡,因为目标函数没有从堆栈中弹出参数。Fwiw,在LoadLibrary()之前使用/DELAYLOAD链接器选项,风险较小,并避免外部“C”在一个不是C的函数上。对于什么您使用LoadLibrary+GetProcAddress而不是使用导入库?为什么这个问题有upvote?这是关于RTC失败0的无数问题,几乎总是回答错误的调用条件。与您的问题无关,但几乎没有任何理由在函数点中有指向containers.WINAPI的指针er声明错误,这是一个
\uu cdecl
函数。堆栈不平衡,因为目标函数没有从堆栈中弹出参数。Fwiw,在LoadLibrary()之前使用/DELAYLOAD链接器选项,风险较小,并避免外部“C”在一个不是C的函数上。对于什么您使用LoadLibrary+GetProcAddress而不是使用import library?为什么这个问题有upvote?这是关于RTC故障0的无数个问题,答案几乎总是错误的调用控制。