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

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

feedbee

Гость
#1
Есть такой код:
Код:
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

Гость
#2
Да. Вообщем-то я пробывал приводить к разным типам, но любое приведение заканчивается:
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

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

feedbee

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

feedbee

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

feedbee

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

feedbee

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