![]() |
Модераторы: bsa |
![]() ![]() ![]() |
|
Dementor |
|
||||||
Шустрый ![]() Профиль Группа: Участник Сообщений: 60 Регистрация: 9.7.2007 Репутация: нет Всего: нет |
Доброго всем дня!
Вопрос переехал из темы: VBA и DLL, Как вернуть в VBA результат из DLL Что имеем: 1. Имеется структура:
2. Имеется функция:
Массивы Master и Slave заполняются на стороне VBA и содержат внутри себя те же структуры Contour. С ними проблем нет - они адекватно получаются в DLL и адекватно обрабатываются. Проблема возникает в заполнении массива Result. Вот код, который используется для его заполнения:
Поясню для чего я делаю *Result = *Master и NewContour = MasterArray[0].Vertexes: если я все правильно понял из гугления, то для того, что бы легально создать SAFEARRAY, который содержит внутри себя структуру, надо эту самую структуру создавать через IDL, но если честно, то как именно это сделать я не очень понял и поэтому методом проб и ошибок пришел к выводу, что вот подобное работает (в предыдущей версии функции все три массива содержали просто структуры Point3d и Result формировался без каких-либо проблем). А теперь в чем же проблема: после всех операций массив Result содержит нужное количество элементов, однако все элементы одинаковые и равны последнему, который в него передавался. Я пытался вместо SAFEARRAY *NewContour задавать массив Contour с количеством элементов как в Result, заполнять вершинами каждый i-ый элемент и в Result записывать именно i-ый элемент. Но ничего не изменилось. Я конечно понимаю, что я чего-то недопонимаю в самом C++ и SAFEARRAY в частности, но очень прошу помощи в том, что бы разобраться в возникшей проблеме. Заранее всем откликнувшимся огромное спасибо! |
||||||
|
|||||||
xvr |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 35 Всего: 223 |
Этого делать нельзя. ActiveX подсистема имеет полное право убить Master при возврате из вашего метода и ваш Result повиснет в воздухе. Затем вы пытаетесь записать в SAFEARRAY *Vertexes структуру Point3d. Vertexes на это точно расчитан? |
|||
|
||||
Dementor |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 60 Регистрация: 9.7.2007 Репутация: нет Всего: нет |
xvr, хорошо, тогда можем предположить, что никакого Result нет, а результат работы функции я буду записывать в Master, меняя его размер с помощью SafeArrayRedim под нужный мне и далее уже заново заполняя его элементы. Такой подход будет правильным?
Что касается SAFEARRAY *Vertexes и Point3d. Т.к. все три массива заведомо создаются на стороне VBA, то там это выглядит так:
Т.е. с моей точки зрения все достаточно правильно. По крайней мере я вижу подтверждение правильности на примере массивов Master и Slave, элементы которых и представляют из себя массивы Point3d. Что касается самой структуры Point3d, то она и в C++ и в VBA состоит из 3-х Double. |
|||
|
||||
Dementor |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 60 Регистрация: 9.7.2007 Репутация: нет Всего: нет |
Просто ради интереса переделал. Убрал Result, вместо него теперь Master (хотя может это тоже не верно). Ну и перешел с SafeArrayPutElement на работу через SafeArrayAccessData. Но в общем-то ничего и не изменилось в плане результата: теперь уже в Master образуется нужное количество элементов, но каждый элемент равен последнему записанному.
|
|||
|
||||
Dementor |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 60 Регистрация: 9.7.2007 Репутация: нет Всего: нет |
xvr, в общем все заработало.
Просто после SafeArrayRedim для главного SAFEARRAY я провел копирование нулевого элемента (который гарантированно всегда есть и который не уничтожается при SafeArrayRedim) во все остальные. Соответственно после этого адекватно проходит SafeArrayRedim для вложенного массива! Может это и костыль и так делать не очень правильно, но по крайней мере работает. У меня остался один вопрос, который я не могу понять. Вот вы пишете, что "ActiveX подсистема имеет полное право убить Master при возврате из вашего метода и ваш Result повиснет в воздухе.", но почему ActiveX убьет массив, который после выполнения неких операций в DLL может еще использоваться в самом VBA? |
|||
|
||||
xvr |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 35 Всего: 223 |
Это неправильно. Вы отдублировали ВСЕ массивы в один. Т.е. у вас реально один массив, по всем индексам.
А может и нет. Поэтому может и убить. |
|||
|
||||
Dementor |
|
||||
Шустрый ![]() Профиль Группа: Участник Сообщений: 60 Регистрация: 9.7.2007 Репутация: нет Всего: нет |
xvr, простите, что достаю вопросами, но сам понять это я не в состоянии и поэтому прошу пояснить.
Предположим, что вот это делать нельзя:
Но без этого не выполняется вот это:
И тогда возникает вопрос: если так делать нельзя, то как тогда можно сделать, что бы был корректный результат? Сейчас по крайней мере у меня в VBA после выполнения в функции DLL в массиве Master содержатся все необходимые элементы именно в том виде, в котором они и должны быть... P.S. равно также работает если делать SafeArrayCopy(*Master, Result); и потом уже работать с Result. Поэтому даже вдвойне непонятно - почему это неправильно? Это сообщение отредактировал(а) Dementor - 17.2.2016, 20:21 |
||||
|
|||||
xvr |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 35 Всего: 223 |
Вот как раз так делать можно: SafeArrayCopy(pcnt[0].Vertexes, &pcnt[i].Vertexes). А вот так pcnt[i].Vertexes=pcnt[0].Vertexes - нельзя
Это правильно. А *Result=*Master - нет |
|||
|
||||
Dementor |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 60 Регистрация: 9.7.2007 Репутация: нет Всего: нет |
xvr, спасибо большое за пояснение, а то я думал, что и с таким подходом я не прав. Просто я конечно должен был уточнить, что я имел ввиду под копированием и тогда не было бы недопонимания. Еще раз большое спасибо за помощь и объяснения!
![]() |
|||
|
||||
![]() ![]() ![]() |
Правила форума "C/C++: Для новичков" | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |