1

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

enter image description here

Но когда я установил время выполнение Libary = многопоточный Debug 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; 
} 

Где я буду неправильно? Танки!

+0

Вы нажали «Повторить» (Repetir), чтобы отладить приложение? Что вы обнаружили? –

+0

Просьба указать спецификацию времени выполнения (MTd, MDd) для вашего приложения и DLL –

+0

Я получаю еще одну ошибку = Exoression _pFristBlock == pHead и применение следует за потоком. но когда функция и вызов снова вернулись к той же проблеме – msantiago

ответ

4

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

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

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

в

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

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

+0

.. и вызывать с помощью 'func (str.c_str())'; – WhozCraig

+0

Танки! Приложение отлично работает – msantiago

Смежные вопросы