Увольнение событий из неуправляемой функции - PullRequest
2 голосов
/ 20 октября 2011

Я пытаюсь вызвать событие из неуправляемой функции, используя указатель на управляемый объект.Я получаю следующую ошибку:

ошибка C3767: 'ShashiTest::test::OnShowResult::raise': функции-кандидаты недоступны

Как я могу вызвать обычную функцию ShowMessage без проблем?

#pragma once

#using<mscorlib.dll>
#using<System.Windows.Forms.dll> 

using namespace System;
using namespace System::ComponentModel;
using namespace System::Collections;
using namespace System::Diagnostics;
using namespace System::Windows::Forms;

namespace ShashiTest {
    public delegate void ShowResult(System::String^);

    public ref class test
    {
    public:
        event ShowResult^ OnShowResult;
        test(void)
        {
        };
        void ShowMessage()
        {
            MessageBox::Show("Hello World");
        }
    };

    class ManagedInterface
    {
    public:
        gcroot<test^> m_test;
        ManagedInterface(){};
        ~ManagedInterface(){};

        void ResultWindowUpdate(std::string ResultString);
    };
}

void ShashiTest::ManagedInterface::ResultWindowUpdate(std::string ResultString)
{
    if(m_test)
    {
        System::String ^result = gcnew system::String(ResultString.c_str());
        m_test->OnShowResult(result);
    }
}

1 Ответ

1 голос
/ 24 марта 2012

Вы можете сделать это, определив событие вручную и изменив уровень доступа части raise() на internal или public. (По умолчанию protected или private - подробности см. В сообщении ildjarn по адресу http://social.msdn.microsoft.com/forums/en-US/vclanguage/thread/ff743ebd-dba9-48bc-a62a-1e65aab6f2f9.)

Для меня скомпилировано следующее:

public ref class test
{
public:
    event ShowResult^ OnShowResult {
        void add(ShowResult^ d) {
            _showResult += d;
        }
        void remove(ShowResult^ d) {
            _showResult -= d;
        }
    internal:
        void raise(System::String^ str) {
            if (_showResult) {
                _showResult->Invoke(str);
            }
        }
    };
    test(void)
    {
    };
    void ShowMessage()
    {
        MessageBox::Show("Hello World");
    }
private:
    ShowResult^ _showResult;
};

Альтернативой может быть определение вспомогательной функции, которая будет запускать событие.

...