• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

    На последнюю неделю приходится экзамен, где нужно будет показать свои навыки, взломав ряд уязвимых учебных сайтов, и добыть флаги. Успешно сдавшие экзамен получат сертификат.

    Запись на курс до 25 апреля. Получить промодоступ ...

Получение значений из Safearray Of Bstr от Com-объекта

  • Автор темы feedbee
  • Дата начала
Статус
Закрыто для дальнейших ответов.
F

feedbee

Есть такой код:
Код:
Type t = 
Type.GetTypeFromProgID("DEGetBlockFmtNamesParam.DEGetBlockFmtNamesParam.1"); 

Object foo = Activator.CreateInstance(t); 

HtmlEdit.ExecCommand(DHTMLEDLib.DHTMLEDITCMDID.DECMD_GETBLOCKFMTNAMES, 
DHTMLEDLib.OLECMDEXECOPT.OLECMDEXECOPT_DODEFAULT, ref foo);

Проблема с параметром foo. В MSDN про него сказано:
VARIANT of type VT_ARRAY that receives the available block format tags. Upon successful return, pvaOut points to a SAFEARRAY of BSTR objects. The caller is responsible for releasing the contents of the SAFEARRAY using the SafeArrayDestroyData and SafeArrayDestroy APIs methods.

Как мне достать в прогу значения из этого массива??? Облазил все, несколько часов что то пытался намутить - результат 0. Очень буду благодарен за помощь.

P.S. Кстати, в отладчике значение foo показано как {System.__ComObject}
 
F

feedbee

Да. Вообщем-то я пробывал приводить к разным типам, но любое приведение заканчивается:
An unhandled exception of type 'System.InvalidCastException' occurred in WindowsApplication3.exe

Additional information: Unable to cast COM object of type 'System.__ComObject' to class type 'System.Array'. Instances of types that represent COM components cannot be cast to types that do not represent COM components; however they can be cast to interfaces as long as the underlying COM component supports QueryInterface calls for the IID of the interface.

Я даже сделдал метод для раскрытия этого массива

Код:
void ViewStrings([MarshalAs(UnmanagedType.SafeArray, SafeArraySubType = VarEnum.VT_BSTR)] ref String[] ar)
{
foreach (String str in ar)
MessageBox.Show(str);
}

Но по-прежнему проблема - как его туда передать. Приведения типов не прокатывают (см. выше).
 
F

feedbee

Этот код, и подобный ему на JS и VB я уже наблюдал много раз. Весь гугл обшарил же :( Здесь проблема в том, что на C# нельзя так просто писать как на VB или Java. Имея foo типа object я не могу получить его .Names... VBArray у меня нет (или не нашел?).
 
F

feedbee

О боги, it works!
На то что бы поиметь эту строку я потратил около 8 часов :(
sax_ol - спасибо!!!
 
F

feedbee

Ну так было написано. Этот кусок кода я нашел в гугле :( Есть варианты по-другому?
 
F

feedbee

Как ни странно, и так тоже работает :)) Значит оставим object foo = new DHTMLEDLib.DEGetBlockFmtNamesParam();
 
F

feedbee

fckeditor - он же и сделан на базе этого же компонента. Но он ращитан на web, т.е. требует наличия web-сервера. Моя же прога офлайн, простое windows applion, в нем нужно встроить визуальный HTML-эдитор с базовым набором функций. Вот это и делаю.
 
Статус
Закрыто для дальнейших ответов.
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!