|
Модератор
3410 / 2182 / 354
Регистрация: 13.01.2012
Сообщений: 8,472
|
||||||||||||||||
Не работают функции 64 бит библиотеки в надстройке Эксель 201323.05.2016, 14:38. Показов 3340. Ответов 42
Метки нет (Все метки)
Имеется DLL: одна для 32 бит и одна для 64 бит
h-файл Кликните здесь для просмотра всего текста
cpp-файл Кликните здесь для просмотра всего текста
сборка для 64 бит в MinGW64 Кликните здесь для просмотра всего текста
f:\mingw64\bin\g++ -mdll -Wl,--kill-at x.cpp -o x.dll
имеется надстройка Excel Кликните здесь для просмотра всего текста
в версиях 32 бит все работает как надо. в Excel 2010 64 бит все так же нормально. в Excel 2013 64 бит вызов функции x_x вне зависимости от аргумента возвращает ноль. причина?
0
|
||||||||||||||||
| 23.05.2016, 14:38 | |
|
Ответы с готовыми решениями:
42
Пустая закладка в надстройке Outlook 2013
|
|
|
||
| 16.06.2016, 11:45 | ||
|
0
|
||
|
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
|
|||
| 16.06.2016, 11:46 | |||
|
Добавлено через 53 секунды
0
|
|||
|
|
||
| 16.06.2016, 11:52 | ||
|
2
|
||
|
Модератор
3410 / 2182 / 354
Регистрация: 13.01.2012
Сообщений: 8,472
|
||||||
| 16.06.2016, 13:59 [ТС] | ||||||
|
Убежденный, HighPredator, итак, в функцию в самое начало был добавлен код
0
|
||||||
|
Ушел с форума
|
|||||||
| 16.06.2016, 23:32 | |||||||
Сообщение было отмечено BANO как решение
Решение
Уф, пришлось попотеть (как человеку, который никогда не программировал на VBA и
пользуется MS Office раз в полгода для задач класса "письмо написать"). ![]() Ковыряние в дампе и запуск Excel под отладчиком ничего не дало. Я даже не мог из VBA нормально вызвать MessageBox, ни на Excel 2010, ни на Excel 2013, вместо аргументов передавалась какая-то ерунда. А разгадка нашлась здесь: How to: Access DLLs in Excel https://msdn.microsoft.com/en-... 2147217396
user-defined function". Заработало так (проверил на Excel 2010 и на Excel 2013, оба 64-битные):
3
|
|||||||
|
Модератор
3410 / 2182 / 354
Регистрация: 13.01.2012
Сообщений: 8,472
|
||
| 17.06.2016, 10:03 [ТС] | ||
|
Убежденный, через обертку работает, Спасибо! пока это единственный реально работающий способ, люди влепите кто-нибудь "лучший ответ", а то движок нашего форума не дает мне это сделать видимо от того что я поставил отзыв на пост.
---- любопытные факты: 1) вызов функций DLL декларированных в модуле надстройки Excel прямо с листа книги Excel работает на всех 32 битных версиях и на 64 битных версиях до 2010 включительно - только Excel 2013 64 бит по каким-то причинам что-то изменил в порядке вызова функций: Excel видит функции, вызывает их и получает от них КОРРЕКТНЫЙ результат, но не может корректно передать им параметры - интересно какого лешего они там сделали и все переломали по сравнению с предыдущими версиями которые работали на протяжении 20 лет??? 2) как уже сказано - удивительно, что Excel 2013 64 бит передав в функцию некорректные параметры умудряется получить КОРРЕКТНЫЙ результат (!!!) - я возвращал из функций вместо результата вычислений просто число 123 и для double и для DWORD (причем ради чистоты эксперимента параметры продолжали передаваться в функцию) - на листе книги Excel при вызове выдается АБСОЛЮТНО корректные 123. то есть если я правильно понимаю ситуацию вызов происходит правильно - краш от неправильной очистки стека не происходит или мы просто не замечаем этого так как это не критично из-за стратегии применяемой Excel при вызове 3) что же заставляет Excel передавать неверные и МЕНЯЮЩИЕСЯ параметры в функцию??? вот какую любопытную фразу я нашел тут и пока еще осмысливаю
![]() Добавлено через 7 минут 4) возврат результата наверное идет корректно потому что возвращается POD через EAX и в этом мнение DLL и Excel совпадают
0
|
||
|
Ушел с форума
|
|
| 17.06.2016, 10:08 | |
|
vxg, в Win64 первые четыре аргумента всегда передаются через регистры -
RCX, RDX, R8, R9, а в случае с double, как в нашем примере, используется XMM0 (SSE). Но, как я понял из игр с отладчиком, 64-битный Excel не передает параметры корректно, если для функции не была сделана "регистрация" (registration, см. выше). Там и в стеке, и в регистрах в момент вызова получается полная каша. Когда я поменял Double на Long, то мне вдруг стал приходить правильный аргумент в XMM0. В других случаях правильный аргумент оказывался в регистре RBX. В случае с MessageBox аргументы словно "сдвинулись" на один влево. И т.д. И только при вызове через враппер все стало нормально. Причем у меня это поведение наблюдалось и на Office 2010.
0
|
|
|
Модератор
3410 / 2182 / 354
Регистрация: 13.01.2012
Сообщений: 8,472
|
|||
| 17.06.2016, 10:33 [ТС] | |||
|
Убежденный, странно... я отлаживал DLL на Excel 2010 64 бит и у человека который прислал мне отчет об ошибке тоже все корректно работает на Excel 2010 64 бит без оберток...
Добавлено через 1 минуту Убежденный, а может быть так как я написал? что Excel как-то по своему неожиданно для DLL передает параметры? вот, пытаюсь найти ключики управляющие передачей в g++ Добавлено через 35 секунд ...может за волшебство отвечает студия? если в ней собрать DLL они сразу друг друга поймут)? Добавлено через 1 минуту ...просто этому обязано быть объяснение. то что обертка работает - это да, но все таки мне кажется каким то хаком. должна быть причина аномалии Добавлено через 51 секунду ...оборачивать каждый раз функцию что бы вызвать с листа это графоманский идиотизм какой то Добавлено через 12 минут Добавлено через 2 минуты что то такое
0
|
|||
|
Ушел с форума
|
|||||||
| 17.06.2016, 10:59 | |||||||
|
У меня была Office 2010 Professional Plus SP2, какой-то репак с торрента, подлинность версии под вопросом, но это все, что было под рукой.
было вызывать, даже WinAPI-шные.
И ассемблерный код функции x_x смотрел: и в случае GCC, и в случае MSVC, там все корректно.
![]() На MSDN написано "cannot", значит все, дальше копать не рационально.
Но ведь кроме VBA-обертки, есть и другие варианты. Я, правда, в них не разбирался.
0
|
|||||||
|
Модератор
3410 / 2182 / 354
Регистрация: 13.01.2012
Сообщений: 8,472
|
|||
| 17.06.2016, 12:17 [ТС] | |||
|
Убежденный
покопал тему нашел такие вот печальки: тут человек столкнулся с этой проблемой в Excel 2010 и не долго думая решил ее через оборачивание тут человек столкнулся с этой проблемой в Excel 2013, написал в MS и получил ответ - миграция на XLL - причем ответили ему одно и то же два раза как попугаи тут мой крик о проблеме ибо проблема есть и она не решена) пусть хоть скажут П О Ч Е М У ? Добавлено через 2 минуты Добавлено через 39 секунд ...там много чего написано в том числе в разных местах например указывается разный размер типов)) Добавлено через 1 минуту Добавлено через 40 секунд ...XLL не хочу использовать так как это хранение специфичного хлама в общей DLL
0
|
|||
|
Модератор
3410 / 2182 / 354
Регистрация: 13.01.2012
Сообщений: 8,472
|
||
| 21.06.2016, 15:20 [ТС] | ||
|
вот что мне ответили эти г@ндоны
0
|
||
| 21.06.2016, 15:24 | |
|
Не по теме: Не ну в принципе ожидаемый ответ..
0
|
|
|
Модератор
3410 / 2182 / 354
Регистрация: 13.01.2012
Сообщений: 8,472
|
|
| 21.06.2016, 15:26 [ТС] | |
|
HighPredator, честно говоря ожидал что меня пошлют чуть более романтично. что-нибудь вроде: спасибо за ваш отчет об ошибках! наши инженеры работают над устранением проблемы. как только решение будет найдено мы обязательно сообщим вам! согласитесь - это вызывает меньше бешенства при той же смысловой нагрузке в виде "отвалите"
0
|
|
|
|
|
| 21.06.2016, 15:32 | |
|
vxg, я не очень внимательно изучил детали ответа, но у меня сложилось впечатление, что вам ответил не представитель их QA, а кто-то из верхов коммьюнити. Поэтому вроде как он и не должен расшаркиваться.
Добавлено через 1 минуту Посмотрел. Действительно это не сотрудник мс, а просто аффилированое лицо.
0
|
|
|
Модератор
3410 / 2182 / 354
Регистрация: 13.01.2012
Сообщений: 8,472
|
||
| 21.06.2016, 15:38 [ТС] | ||
|
0
|
||
|
|
|
| 21.06.2016, 15:42 | |
|
vxg, все может быть.
0
|
|
|
Модератор
3410 / 2182 / 354
Регистрация: 13.01.2012
Сообщений: 8,472
|
|||||||||||
| 22.06.2016, 10:25 [ТС] | |||||||||||
|
Убежденный, HighPredator, еще одна шарада из той же оперы:
есть функция
0
|
|||||||||||
|
Ушел с форума
|
||
| 22.06.2016, 10:54 | ||
|
Все оттуда же:
How to: Access DLLs in Excel https://msdn.microsoft.com/en-... 2147217396
Надо запаковывать String в Variant, тогда строка будет Юникодная, в широких символах, которая получается из SysAllocString.
0
|
||
|
Модератор
3410 / 2182 / 354
Регистрация: 13.01.2012
Сообщений: 8,472
|
|
| 22.06.2016, 11:30 [ТС] | |
|
Убежденный, BSTR не юникод? пошел думать с отвалившимся мозгом...
0
|
|
|
Ушел с форума
|
|
| 22.06.2016, 11:38 | |
![]() BSTR - это, как правило, UTF-16 Little Endian. Как правило, но не всегда. BSTR может использоваться как контейнер для передачи ANSI-строк и даже (о, ужас!) двоичных данных, потому что подсистема COM "знает" про данный тип, т.е. как передать его между процессами/компьютерами, как определить длину данных и т.д. См. SysAllocStringByteLen, например.
0
|
|
| 22.06.2016, 11:38 | |
|
Подключение сторонней библиотеки OpenCV в VS 2013 Ошибка подключения динамической библиотеки VS 2013 Подключение библиотеки OpenCV в Visual Studio 2013 Установка библиотеки libxml++. Visual Studio 2013 Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Альцгеймер и колоссальный объем вычислений
Programma_Boinc 08.08.2026
Альцгеймер и колоссальный объем вычислений
Сейчас по направлению болезни Альцгеймера идет колоссальный объем вычислений.
Это один из главных приоритетов проекта.
Такой массовый наплыв задач. . .
|
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства.
Родственных связей существует 8 ступеней, такие как:
p - отец
P - мать
q - муж
Q - жена
b - брат
B - сестра
s - сын
S - дочь
|
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире.
Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
|
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С.
Задача:
Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
|
|
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
|
Как ИИ начал спорить и врать (возможно почуяв опасность для себя от индустрии - уход от электроники).
Hrethgir 04.08.2026
Недельный диалог, на фоне событий с НПЗ. Да, из спирта можно получать бензин, и это не сложно. Но потом в схеме я решил избавиться от насоса, при этом полностью сделав контроль подачи спирта в. . .
|
Термопринтер QR701
Argus19 03.08.2026
Термопринтер QR701
Купил два термопринтера QR701.
На сэлф-тесте написано:
Language: PC936 (GB18030).
Что означает, что принтеры могут печатать только латиницу и китайские иероглифы. Так же. . .
|
Создание формы заимствованного документа
Maks 03.08.2026
Задача:
Необходимо создать собственную форму заимствованного документа. На форме должен быть реквизит "Покупатель", а также
табличная часть со следующими реквизитами:
- Расчетный счет покупателя. . .
|