1

コールバック関数で動作する dll を作成する必要があります。プロジェクトのプロパティで Runtime Library = Multi-threaded Debug (/ MTd) を設定すると、次のエラー メッセージが生成されます。

ここに画像の説明を入力

しかし、Runtime Library = Multi-threaded 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;
}

どこが間違っていますか?タンク!

4

1 に答える 1

4

私には、DLL の境界を越えてstd型 (この場合は) を渡すという古典的な問題のように思えます。std::string

ベスト プラクティスとして、DLL の境界を越えて「ネイティブ」データ型のみを渡します。プロトタイプを

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

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

基礎となるランタイムに関係なく、コードは機能します

于 2013-03-15T18:27:21.917 に答える