![]() |
Модераторы: MetalFan |
![]() ![]() ![]() |
|
OleGator08 |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 10 Регистрация: 14.1.2008 Где: Тюмень Репутация: нет Всего: нет |
В теме:
http://forum.vingrad.ru/index.php?showtopic=156830&view=findpost&p=1161584 Приведены замечательные функции работы с диапазонами данных MS Excel. function IntToVar(dato: longint): variant; function DoubleToVar(dato: double): variant; function VarToDouble(const dato: variant): double; procedure RangeToMatrix(const rango: variant; var matriz: tmatriz); procedure RangeToVector(const rango: variant; var matriz: tvector_); procedure MatrixToRange(const matriz: tmatriz; var rango: variant); procedure VectorToRange(const matriz: tvector_; var rango: variant); Уже много лет я использую их в своей служебной DLL для облегчения и улучшения труда инженеров в среде MS Excel (32 бит). По сути создана собственная среда моделирования на базе электронных таблиц, но расчетное ядро написано мной на Delphi (уже теперь на XE5 пере транслировано). Однако увы, время идет, меняется ПО. И вот уже начинают постепенно устанавливать 64 битную как и операционную систему, так и MS Office. Я на XE5 ввел косметические исправления в проекте XE5 для 64-битной версии DLL ( OleAuto ушла и там в Uses для 64 бит: ComServ и ComObj). Все скомпилировалось, но... Ввел в надстройку VBA и вот такие подобные изменения: #If VBA7 Then 'Function f_Calc_nD20(pAuth: PWideChar; const pTbC, pMM, pRHO:Double):Double; stdcall; '// Расчет отн. плотности 15_15 Public Declare PtrSafe Function ПокПрел20С Lib "C:\InfoCalc\FuncExcel\LibXLS\LibBalansPropery.dll" Alias "f_Calc_nD20" _ (ByVal pAuth As String, _ ByVal pTbC As Double, _ ByVal pMM As Double, _ ByVal pRHO As Double _ ) As Double ' Whi, Ria, Lee, Sim, APIE Public Declare PtrSafe Function МолекМассФр Lib "C:\InfoCalc\FuncExcel\LibXLS\LibBalansPropery.dll" Alias "f_Calc_MM_Fr" _ (ByVal ТемпКип_С As Double, _ ByVal Плотн_20С As Double, _ ByVal Метод As String) As Double У себя пока не имею возможности ничего испытать, но увы, как только подключили соотв. 64-бит надстройки с ссылками на соотв. DLL (64 бит) все перестало работать у моих коллег после перехода на 64-бит MS Office! Ломаться там нечего больше. Только эти функции перестали работать на 64-битовом Excel. Может кто то уже модернизировал эти функции и разобрался в специфике передачи диапазонов данных в функции DLL для Excel? Помогите, пожалуйста, времени нет глубоко заниматься... Прежде всего обращаюсь к автору ранее упомянутой темы, она уже закрыта... С уважением, Олег. |
|||
|
||||
Albinos_x |
|
|||
![]() Evil Skynet ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3288 Регистрация: 28.5.2004 Где: X-6120400 Y-1 4624650 Репутация: 15 Всего: 108 |
в приведенной статье функции в которых тоже ломаться нечему. Но вот в приведенном примере VBA я обратил внимание на входные параметры string, т.к. я не знаю на каком компиляторе делалась 32 разрядная библиотека - предположу что на Delphi 7, то как раз эти входные параметры могут быть вашей проблемой в этом случае. При перекомпиляции на XE5 нужно в функциях четко указать, что это ansi или переписать код с учетом, что это может быть другая кодовая таблица.
если моя идея не верна, то нужны какие-нибудь отладочные данные, т.к. по приведенному коду и описанию проблемы не понятно в чем проблема. С точки зрения офиса - все мои давно написанные программы x32 прекрасно работают как с 32 так 64 разным офисом. Изменение в функциях офиса есть (с 2010 до 2021), но они не большие, но в рамках стандартных операций они не существенны и не влияют на работу программ, поэтому даже определение версионности офиса я почти нигде не применял. -------------------- "Кто владеет информацией, тот владеет миром" Уинстон Черчилль |
|||
|
||||
OleGator08 |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 10 Регистрация: 14.1.2008 Где: Тюмень Репутация: нет Всего: нет |
Здравствуйте!
После долгого времени вновь думаю возвратится к решению этой проблемы! Благодарю за отклик! Как я понял Вы предлагаете в XE5 для строковых переменных поставить тип AnsiString? Сейчас у меня в функциях стоит тип PWideChar, который по сути эквивалентен, возможно я и не прав. То есть функции в коде XE5 выглядят так: // ф-я расчета показателя преломления при 20 С. Function f_Calc_nD20(pAuth: PWideChar; const pTbC, pMM, pRHO:Double):Double; stdcall; Function f_Calc_MM_Fr(const pTb, pRHO: Double; const pCase:PWideChar):Double; stdcall; и т.д. По сути именно при переходе на этот строковый тип все стало в 32 работать адекватно и для этого типа заявлено: Тип Максимальный размер строки Размер переменной Объем памяти, требуемый для хранения строки pWideChar не ограничено 4 байта 4 байта + (размер строки+1)*2 AnsiString ~2^31 символов 4 байта 4 байта + (0 .. 2 Гбайт) Источник https://sources.ru/magazine/0804/delphistr.html Я не проверил пока, но этот строковый тип вроде также адекватен! Зря я сразу это не привел, мой косяк! Я не нашел строковых типов, заявленных именно для 64-битовых приложений. Пишут что WideString более подходит для COM приложений и реализован также как AnsiString. Неужели тип PWideChar - ошибка??? Если прокомментируйте, было бы здорово! Неужели в этом типе ошибка? Пока буду вновь разворачивать 64 офис и т.д. |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Delphi: ActiveX/СОМ/CORBA" | |
|
Запрещено: 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Rrader, Girder. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Delphi: ActiveX/СОМ/CORBA | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |