Модераторы: MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> DLL для работы в MS Excel 64 bit, Передача диапазонов данных Excel в DLL  
:(
    Опции темы
OleGator08
Дата 8.12.2021, 15:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 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

Помогите, пожалуйста, времени нет глубоко заниматься...  Прежде всего обращаюсь к автору ранее упомянутой темы, она уже закрыта...

С уважением, Олег.



PM MAIL ICQ   Вверх
Albinos_x
Дата 11.2.2023, 13:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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), но они не большие, но в рамках стандартных операций они не существенны и не влияют на работу программ, поэтому даже определение версионности офиса я почти нигде не применял.


--------------------
"Кто владеет информацией, тот владеет миром"    
Уинстон Черчилль
PM MAIL ICQ   Вверх
OleGator08
Дата 4.5.2023, 15:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 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 офис и т.д.





PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: ActiveX/СОМ/CORBA"

Rrader
Girder

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами


  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Delphi
  • Вопросы по SQL и вопросы по базам данных, не связанные с Delphi, задавать здесь

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Rrader, Girder.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: ActiveX/СОМ/CORBA | Следующая тема »


 




[ Время генерации скрипта: 0.0973 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.