![]() |
|
|
![]()
|
|
| franzR |
|
||||||||
|
Новичок Профиль Группа: Участник Сообщений: 23 Регистрация: 12.10.2009 Репутация: нет Всего: нет |
Builder6, .Net framework 2.0, WinXP SP3
Доброго времени суток! Столкнулся с такой проблемой. Есть библиотека написанная на .NET, собрана как COM и зарегистрирована на машине. Есть проект Builder6, туда подключена эта же либа как COM. Из COM-библиотеки возвращается некая структура типа Report, которая имеет в себе несколько полей. Report в SDK имеет вид:
В Builder ипользуется так:
В вышеописаном случае текстовый ответ приходит нормально и данные выводятся в лог. Но при попытке доступа к данным которые идут из SDK как object, а в builder они уже IUnknown типа, получается каша если делать так:
Данные приходят точно того типа к которому они приведены (DATA_IDENT *), почему не получается доступиться к текстовому полю структуры DATA_IDENT как и в варианте с ans.Text? DATA_IDENT структура имеет такой вид:
Та же проблема и смассивом байт которые приходят в обьекте IUnknown. Не могу понять как их от туда извлечь! Уважаемые знатоки подскажите выход из ситуации! |
||||||||
|
|||||||||
| simpo |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 11 Регистрация: 20.2.2011 Репутация: нет Всего: нет |
С понятием маршалинга знакомы? Если да-покажите как вы это делаете, а если нет - то начните с чтения COM and .NET Interoperability, by Andrew Troelsen
|
|||
|
||||
| franzR |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 23 Регистрация: 12.10.2009 Репутация: нет Всего: нет |
Знаком но очень слабо. Если бы было время разбираться то наверное не задавал бы вопросов, а сел бы и почитал про COM, но увы времени не так много.
Вот для извлечения массива байт из самой Result делаю так:
использую так:
Естественно без проверок на удачное извлечение и прочих предостережений. Пока так. А вот как вытащить данные из объекта IUnknown пока не могу сообразить. Чет не идет.... |
||||
|
|||||
| simpo |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 11 Регистрация: 20.2.2011 Репутация: нет Всего: нет |
Типы СОМ и типы .net напрямую не соответствуют, потому вам необходимо сообщить среде как интерпретировать пришедшую ей из СОМ неуправляемую структуру. Для этого и нужен маршалинг. Делается это с помощью специальных атрибутов,например,marshalas
http://msdn.microsoft.com/en-us/library/sy...sattribute.aspx нахрапом ваша задача не решиться,придется рабиратся |
|||
|
||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 8 Всего: 223 |
Более того, прямое преобразование типов интерфейса от IUnknown к любому другому в COM запрещена (точнее может работать, а может и не работать). Делайте IUnknown::QueryInterface
PS. По поводу interoperability COM <-> .NET все остается в силе, сначала надо её обеспечить, и только потом заниматься танцами вокруг разных COM интерфейсов |
|||
|
||||
| franzR |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 23 Регистрация: 12.10.2009 Репутация: нет Всего: нет |
Посмотрел по ссылке на пример, попробовал сделать следующее:
Но по обращению к полю все равно данные приходят не те что нужно. Черкните если не сложно, как правильно должно выглядеть объявление структуры понятной потом builder-у. Или на практике все таки лучше использовать утилиту Tlbexp.exe которую советует Microsoft? |
|||
|
||||
| simpo |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 11 Регистрация: 20.2.2011 Репутация: нет Всего: нет |
tlbexp это,само собой. только код на диезе все равно должен описывать,что именно вы отдаете по СОМ. у вас этого пока нет. + покажите интерфейсы,а то пока разговор ниачем. маршалинг также касается и интерфейсов.
Как описана эта же структура в билдере? как вы ее запрашиваете? Это сообщение отредактировал(а) simpo - 28.2.2011, 18:07 |
|||
|
||||
| franzR |
|
||||||||||||
|
Новичок Профиль Группа: Участник Сообщений: 23 Регистрация: 12.10.2009 Репутация: нет Всего: нет |
Вот код-пример либы:
Описание в Builder получаю автоматически при выполнении Import type library, из предварительно зарегистрированой библиотеки утилитой RegAsm.exe (regasm CCNET.dll /tlb:CCNET.tlb). В проект просто добавляется файл .TLB Так вот структура прописана в сгенерином TLB файле.
Пытаюсь использовать либу вот так:
в этом случае в лог выводятся нормальные данные.
Запрашиваю структуру просто вводя ее имя и Builder мне ее подсвечивает. Может я не допонял сам вопрос... Вот так пытаюсь получить данные из ответа приведя их к типу моей структуры (как я уже понял из разговора неверно описаной в либе).
тут пишет кракозяблы. И вот именно извлечение данных на этом этапе когда идет уже обращение к объекту типа IUnknown которым является ans.Additional_Data и начинаются проблемы. Это сообщение отредактировал(а) franzR - 28.2.2011, 20:17 |
||||||||||||
|
|||||||||||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 8 Всего: 223 |
Я в .NET не специалист, но сдается мне, что в таком виде это работать не будет никогда
|
|||
|
||||
| simpo |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 11 Регистрация: 20.2.2011 Репутация: нет Всего: нет |
Вы зря пытаетесь передать Additional_Data как object. Это еще додуматься надо было,если честно. Это сообщение отредактировал(а) simpo - 28.2.2011, 23:36 |
|||
|
||||
| franzR |
|
||||||
|
Новичок Профиль Группа: Участник Сообщений: 23 Регистрация: 12.10.2009 Репутация: нет Всего: нет |
simpo - 28.2.2011, 23:36
Может и зря но работает отлично, и проблем с использованием в .NET нету. Вопрос с IUnknown решился изменением структур на классы и обьяевлением их вот так:
Автоматом сгенерились геттеры и сеттеры для unmanaged. Со структурами дела обстоят куда сложнее. Пробовал так:
Но не отрабатывает, вместо данных каша. Так же были попытки с двумя другими вариантами StructLayout, но тоже ничего не получилось. Как мне показалось из-за того, что в моей структуре поля не строго известной длинны, такие как string и byte[] и указать смещение не получается... Как бы его можно было бы так выкрутиться? Если это возможно конечно... |
||||||
|
|||||||
| simpo |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 11 Регистрация: 20.2.2011 Репутация: нет Всего: нет |
Давайте определимся,проблем нету или кракозяблы все таки?))) |
|||
|
||||
| franzR |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 23 Регистрация: 12.10.2009 Репутация: нет Всего: нет |
simpo:
Давайте определимся))
Эта фраза адресована к использованию библиотеки в .NET. Другое дело использовать ее не получается нормально как COM объект для Builder проекта. В котором собственно и появляются кракозяблы. |
||||
|
|||||
![]()
|
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: COM/DCOM/ActiveX/ATL/CORBA | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |