Как передать строку из C ++ - CLI в C # через обратные вызовы и делегаты C ++ - CLI

У меня есть оболочка C ++ - CLR вокруг стандартной библиотеки C ++, вызываемой из C #. Чтобы получать сообщения о состоянии из библиотеки, я использую делегат, назначенный для обратного вызова в коде C ++ через Marshal :: GetFunctionPointerForDelegate.

Это заняло у меня довольно много времени, чтобы приступить к работе, и я очень, очень близок (я думаю) . Вызывается делегат C #, но строка не передается правильно через границу.

Когда я вызываю TakesCallback («Test String») из кода C ++, я просто получаю мусор обратно в функции C #.

--- Исходный класс C ++ и функция обратного вызова ---

class Solver
{
    private:

    std::string TakesCallback(const std::string message) 
    {
        return cb(message);
    }

    public:

    // Declare an unmanaged function type that takes a string
    typedef std::string (__stdcall* ANSWERCB)(const std::string);
    ANSWERCB cb;
};

--- Функция для установки обратного вызова из управляемой оболочки ----

// Set the delegate callback
void ManagedSolver::SetMessageCallback(SendMessageDelegate^ sendMessageDelegate)
{
    _sendMessage = sendMessageDelegate;

    // Use GetFunctionPointerForDelegate to get the pointer for delegate callback
    IntPtr ip = Marshal::GetFunctionPointerForDelegate(sendMessageDelegate);
    _solver->cb = static_cast<Solver::ANSWERCB>(ip.ToPointer());
} 

--- Функция C # передана в оболочку C ++ \ CLR SetMessageCallBack ----

private void Message(string message)
{
    XtraMessageBox.Show(message, "Done", MessageBoxButtons.OK);
}
6
задан Deduplicator 25 July 2015 в 12:36
поделиться