C++ 回调函数无法进行多线程调试(/MTd)
我需要创建一个与回调函数一起工作的dll。 当我在项目属性中设置Runtime Libary=Multi-threaded Debug/MTd时, 它会生成以下错误消息: 但是当我设置Runtime Libary=Multi-threaded Debug DLL/MDd时,应用程序工作得非常好 查看我的DLL: callbackproc.h callbackpro.cpp stdafx.h 使用dll的我的应用程序 我哪里做错了?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边界传递
坦克 在我看来,在本例中,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);