Я искал в Интернете решение следующей проблемы, но не могу обернуться вокруг него.Отправка обратного вызова C++ для .NET C++/CLI Wrapper
У нас есть большое монолитное приложение med в C++. Чтобы «обновить» его в новом мире, мы вставляем представления WPF в него, сгенерированные в управляемой оболочке C++/CLI. Первоначальный вызов выполняется из C++ с помощью smartpointer.
if (SUCCEEDED(ptr.CreateInstance(__uuidof(CloudServices))))
{
CRect rect;
pWndContainer->GetWindowRect(rect);
ptr->InitializeControl((LONG)pWndContainer->GetSafeHwnd(), ID_AIS_BALANCEMATRIX, bstr.m_str, rect.Width(), rect.Height());
}
А в классе обертке интерфейс объявлен как
interface ICloudServices : IDispatch{
[id(1)] HRESULT InitializeControl([in] LONG hWndParent, [in] LONG controlTypeId, [in] BSTR parameters, [in] LONG width, [in] LONG height);
И реализуется, как это в обертку
STDMETHODIMP CCloudServices::InitializeControl(LONG hWndParent, LONG controlTypeId, BSTR parameters, LONG width, LONG height) { ... }
Проблема: Все отлично и МОФ работы представление отображается в приложении C++. Теперь нам нужно отправить информацию обратно на C++ из .NET-кода.
Как я могу отправить неуправляемую функцию обратного вызова в оболочку в качестве аргумента InitializeControl и как ее использовать/преобразовать в соответствующий делегат .net?
See desired solution schematic
Код C++ реализует COM-сервер. Обратный вызов - это * событие *, [добавить точку подключения] (https://msdn.microsoft.com/en-us/library/7bkz4x17.aspx). –
Спасибо за ваше правильное предложение. Я видел, как сделать реализацию на управляемой стороне, но как я могу использовать это событие в C++? У вас есть пример, который соответствует представленной мной схеме? –