C++ 回调函数无法进行多线程调试(/MTd)

C++ 回调函数无法进行多线程调试(/MTd),c++,dll,callback,microsoft-runtime-library,visual-studio-2010,C++,Dll,Callback,Microsoft Runtime Library,Visual Studio 2010,我需要创建一个与回调函数一起工作的dll。 当我在项目属性中设置Runtime Libary=Multi-threaded Debug/MTd时, 它会生成以下错误消息: 但是当我设置Runtime Libary=Multi-threaded Debug DLL/MDd时,应用程序工作得非常好 查看我的DLL: callbackproc.h callbackpro.cpp stdafx.h 使用dll的我的应用程序 我哪里做错了? 坦克 在我看来,在本例中,std::string跨DLL边界传递

我需要创建一个与回调函数一起工作的dll。 当我在项目属性中设置Runtime Libary=Multi-threaded Debug/MTd时, 它会生成以下错误消息:

但是当我设置Runtime Libary=Multi-threaded Debug DLL/MDd时,应用程序工作得非常好

查看我的DLL:

callbackproc.h

callbackpro.cpp

stdafx.h

使用dll的我的应用程序

我哪里做错了?
坦克

在我看来,在本例中,std::string跨DLL边界传递std类型是一个典型的问题

作为一种最佳实践,只跨DLL边界传递本机数据类型,我确信如果您将原型从

typedef void (CALLBACK * fnCallBackFunc)(std::string value);


无论您的底层运行时如何,您的代码都能正常工作

在我看来,在本例中,跨越DLL边界传递std类型是一个典型的问题

作为一种最佳实践,只跨DLL边界传递本机数据类型,我确信如果您将原型从

typedef void (CALLBACK * fnCallBackFunc)(std::string value);


无论您的底层运行时如何,您的代码都将正常工作

您是否按了Retry Repetir来调试应用程序?您发现了什么?请指定应用程序和DLLI的运行时规格MTd、MDd get Other error=ExoPression _pFristBlock==pHead,并按照流程进行应用。但是,当函数和调用再次出现时,我们又回到了同样的问题,即您正在跨编译单元复制一个std::string,该编译单元从应用程序过渡到DLL。除非两者都是使用相同的构建配置构建的,否则您就是在自我冲洗。请记住,标准库没有正式版本。您的应用程序很可能是使用多线程调试DLL运行时使用/MDd构建的。如果DLL的构建方式不相同,那么您使用的是两个不同的堆管理器,这会让您自食其果。不要跨PE转换传递标准库对象。是否按Retry Repetir调试应用程序?您发现了什么?请指定应用程序和DLLI的运行时规格MTd、MDd get Other error=ExoPression _pFristBlock==pHead,并按照流程进行应用。但是,当函数和调用再次出现时,我们又回到了同样的问题,即您正在跨编译单元复制一个std::string,该编译单元从应用程序过渡到DLL。除非两者都是使用相同的构建配置构建的,否则您就是在自我冲洗。请记住,标准库没有正式版本。您的应用程序很可能是使用多线程调试DLL运行时使用/MDd构建的。如果DLL的构建方式不相同,那么您使用的是两个不同的堆管理器,这会让您自食其果。不要跨PE转换传递标准库对象。。。并使用funcstr.c_str;调用;。。并使用funcstr.c_str调用;
#pragma once

#include "targetver.h"    
#define WIN32_LEAN_AND_MEAN           
// Windows Header Files:
#include <windows.h>
#include <windows.h>
#include <string>

#include "callbackproc.h"

// Callback function to print message receive from DLL
void CALLBACK MyCallbackFunc(std::string value)
{
    printf("callback: %s\n", value.c_str());
}

int _tmain(int argc, _TCHAR* argv[])
{
    // Register the callback to the DLL
    Register_Callback(MyCallbackFunc);

    return 0;
}
typedef void (CALLBACK * fnCallBackFunc)(std::string value);
typedef void (CALLBACK * fnCallBackFunc)(const char* value);