Функция обратного вызова не работает Многопоточная отладка (/ MTd)

Мне нужно создать DLL, которая работает с функцией обратного вызова.
Когда я устанавливаю Runtime Libary = Многопоточная отладка (/ MTd) в свойствах проекта,
он генерирует это сообщение об ошибке:

введите описание изображения здесь

Но когда я устанавливаю Runtime Libary = Многопоточная отладочная DLL (/ MDd), приложение работает отлично

Посмотрите на мою DLL:

callbackproc.h

#include <string>

#ifdef CALLBACKPROC_EXPORTS
#define CALLBACKPROC_API __declspec(dllexport)
#else
#define CALLBACKPROC_API __declspec(dllimport)
#endif

// our sample callback will only take 1 string parameter
typedef void (CALLBACK * fnCallBackFunc)(std::string value);

// marked as extern "C" to avoid name mangling issue
extern "C"{
//this is the export function for subscriber to register the callback function
CALLBACKPROC_API void Register_Callback(fnCallBackFunc func);
}

callbackpro.cpp

#include "stdafx.h"#include "callbackproc.h"#include <sstream>

void Register_Callback(fnCallBackFunc func)
{
int count = 0;

// let's send 10 messages to the subscriber
while(count < 10)
{
// format the message
std::stringstream msg;
msg << "Message #" << count;

// call the callback function
func(msg.str());

count++;

// Sleep for 2 seconds
Sleep(2000);
}
}

stdafx.h

#pragma once

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

Мое приложение, которое потребляет DLL

#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;
}

Куда я иду не так?
Танки!

1

Решение

Кажется мне классической проблемой прохождения std типы (в этом случае std::string) через границы DLL.

Рекомендуется передавать только «родные» типы данных через границы DLL, я уверен, что на 99% вы измените свой прототип с

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

в

typedef void (CALLBACK * fnCallBackFunc)(const char* value);

Ваш код будет работать независимо от вашего времени выполнения

4

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]