SuperMiQi Ответов: 2

[Справка] Как привести / маршалировать LPDISPATCH к system:: object^ ?


Всем Привет,

У меня следующие вопросы, чтобы задать:
Как привести / маршалировать LPDISPATCH к System:: Object^ ?

LPDISPATCH pSetup)
System:: Object^ cSetup = nullptr;
cSetup = (кастинг / маршаллинг) pSetup;

Должен ли я использовать пространство имен System::Runtime::InteropServices ?
Неужели кто-то уже сделал такую сортировку или кастинг ?

Заранее большое вам спасибо.
С уважением.
Мики.

Что я уже пробовал:

Я попробовал static_cast, но получил следующую ошибку компиляции:
BOOL CMyClass::CreateThroughputFile(LPDISPATCH pSetup)
{
	System::Object^ cSetup = nullptr;

	if (static_cast<iremoteoperations^>(_Remoting.GetInterface()) == nullptr)
		return FALSE;

	cSetup = static_cast<system::object^>(pSetup);

возвращается:
Описание Кода Серьезности Состояние Подавления Строки Файла Проекта
Safe_cast C2682 ошибка не может использовать, чтобы конвертировать из 'LPDISPATCH' в 'Система::объект ^'

вернуться _Remoting.GetInterface ()- & gt;CreateThroughputFile(cSetup);

}

2 Ответов

Рейтинг:
1

KarstenK

Сначала вам лучше использовать динамическое приведение dynamic_cast для проверки типа.

Но я думаю, что приведение интерфейса COM-объекта к объекту GC не является правильным. Вы должны обрабатывать исходный (COM) объект как LPDISPATCH и не бросать вокруг. ;-)


Рейтинг:
0

Midi_Mick

В C# я использую для этого класс System.:Runtime::InteropServices::Marshal, и он хорошо работает. Я бы предположил, что в C++ это будет что-то вроде

cSetup = Marshal::GetObjectFromIUnknown(IntPtr(pSetup));


Это позволит правильно маршалировать указатель в поле .Объем взаимодействия, и соответственно устанавливать счетчик.