Сообщение --- от 20.08.2013 12:54
Изменено 20.12.2016 16:54 UCoder
Добрый день! Имеется 32-битная надстройка Excel, скомпилированная C++ Builder 5. Надстройка имеет вид библиотеки DLL (XLL), для реализации своего UI использует VCL, а для связи с Excel применяет Excel C API. Библиотека экспортирует ряд функций, которые предназначены для:
1. Вызова диалоговых окон (VCL) из главного меню Excel
2. Вызова собственных функций рабочего листа из таблиц Excel
Необходимо без перекомпиляции 32-битной DLL иметь возможность использовать все ее функции в Excel 64-бит. Для 64-битной версии интерфейс Excel C API практически не отличается от 32-битной, хотя 32-битные DLL подгружать в 64-битном Excel невозможно. В качестве варианта решения рассматривается создание "обертки", как описано в статье http://blog.mattmags.com/2007/06/30/accessing-32-bit-dlls-from-64-bit-code/
Насколько я понял из статьи, создается 64-битная DLL, которая экспортирует скелеты всех нужных функций, вызываемые Excel, при этом сама DLL запускает 32-битное приложение, которое подключает готовую 32-битную DLL, а обмен данными между 64-битной DLL и 32-битным приложением осуществляется посредством IPC:
[Excel 64-bit]----[DLL-обертка 64-bit]--(IPC)--[приложение 32-bit]----[DLL 32-bit]
Думаю, что для вызова функций рабочего листа (см. п.2 выше) такая схема будет работать без проблем. Однако, есть сомнения насчет работоспособности реализации п.1. В частности, в DllMain 32-битной DLL на событие DLL_PROCESS_ATTACH свойству Application->Handle присваивается Handle главного окна Excel. Благодаря этому все диалоговые окна из DLL работают как часть Excel (например, минимизируются при сворачивании Excel). Но в нашем случае главное окно Excel имеет 64-битный Handle (?), а Application->Handle в DLL — 32-битный. Могут ли из=за этого возникнуть проблемы?
Ето-либо сталкивался с подобной задачей?
Исходники 32-битной DLL имеются, но скомпилировать их под 64-битную платформу пока не представляется возможным.
1. Вызова диалоговых окон (VCL) из главного меню Excel
2. Вызова собственных функций рабочего листа из таблиц Excel
Необходимо без перекомпиляции 32-битной DLL иметь возможность использовать все ее функции в Excel 64-бит. Для 64-битной версии интерфейс Excel C API практически не отличается от 32-битной, хотя 32-битные DLL подгружать в 64-битном Excel невозможно. В качестве варианта решения рассматривается создание "обертки", как описано в статье http://blog.mattmags.com/2007/06/30/accessing-32-bit-dlls-from-64-bit-code/
Насколько я понял из статьи, создается 64-битная DLL, которая экспортирует скелеты всех нужных функций, вызываемые Excel, при этом сама DLL запускает 32-битное приложение, которое подключает готовую 32-битную DLL, а обмен данными между 64-битной DLL и 32-битным приложением осуществляется посредством IPC:
[Excel 64-bit]----[DLL-обертка 64-bit]--(IPC)--[приложение 32-bit]----[DLL 32-bit]
Думаю, что для вызова функций рабочего листа (см. п.2 выше) такая схема будет работать без проблем. Однако, есть сомнения насчет работоспособности реализации п.1. В частности, в DllMain 32-битной DLL на событие DLL_PROCESS_ATTACH свойству Application->Handle присваивается Handle главного окна Excel. Благодаря этому все диалоговые окна из DLL работают как часть Excel (например, минимизируются при сворачивании Excel). Но в нашем случае главное окно Excel имеет 64-битный Handle (?), а Application->Handle в DLL — 32-битный. Могут ли из=за этого возникнуть проблемы?
Ето-либо сталкивался с подобной задачей?
Исходники 32-битной DLL имеются, но скомпилировать их под 64-битную платформу пока не представляется возможным.
---
---