Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 23.12.2009, 18:26   #1
valchakov
 
Регистрация: 23.12.2009
Сообщений: 3
По умолчанию Импорт 32-bit dll в 64-bit

Приветствую, уважаемые форумчане!
Имеется 32-bit приложение и dll написанные на Delphi. dll выполняет функции расширения Explorer. Возникла проблема импорта этой dll в 64-bit системы. Поскольку компилятора 64-разрядного компилятора Delphi не существует, перекомпилировать исходники невозможно (использовать FreePascal (Lezaurus) тоже не удобно, имеются проблемы совместимости). Как можно решить эту проблему? Можно ли написать 64-bit dll например в VS2008, которая будет подгружать имеющуюся 32-bit делфийскую dll, или 64-bit может вызывать только себе подобных? Спасибо за ответы.
Как вариант - использовать COM-объекты, есть ли у кого-нибудь опыт использования этого подхода? Может исходники какие-нибудь, примеры и т.д.
valchakov вне форума Ответить с цитированием
Старый 24.12.2009, 08:54   #2
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 18,136
По умолчанию

Я точно не знаю, но кажись 32-х битные dll должны работать как положено. А вы вообще пробовали запустить ее так, без перекомпиляции?
Далее, какие у Вас проблемы с совместимостью в Лазарусе? Есть определенные стандарты на вызов библиотечных функций и они не зависят от Дельфи и Лазаруса.
Далее, какой смысл Длл над Длл?
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Старый 24.12.2009, 10:22   #3
valchakov
 
Регистрация: 23.12.2009
Сообщений: 3
По умолчанию

Цитата:
Сообщение от Utkin Посмотреть сообщение
Я точно не знаю, но кажись 32-х битные dll должны работать как положено. А вы вообще пробовали запустить ее так, без перекомпиляции?
Далее, какие у Вас проблемы с совместимостью в Лазарусе? Есть определенные стандарты на вызов библиотечных функций и они не зависят от Дельфи и Лазаруса.
Далее, какой смысл Длл над Длл?
По порядку вопросов:
1. Библиотека запускается, но не выполняет своих функций (должны появиться дополнительные пункты контекстного меню проводника с определенным функционалом).
2. В проекте используются сторонние компоненты, которые несовместимы с Лезарусом.
3. Смысл в том, чтобы не переписывать исходную библиотеку, а просто сделать для нее 64-х разрядную обертку.
P.S. На данный момент выяснил, что нельзя вызвать из 64-разрядной 32-разрядную dll, впрочем как и наоборот. Только 32-32 64-64. Нужно искать обходной путь.
valchakov вне форума Ответить с цитированием
Старый 24.12.2009, 10:27   #4
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 18,136
По умолчанию

Ну тогда перепишите ее на том языке, который поддерживает 64 бита .
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Старый 24.12.2009, 21:58   #5
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

По теме. Реально ли из ехе загрузить 64х библиотеку ?(лично не пробовал пока)
BOBAH13 вне форума Ответить с цитированием
Старый 25.12.2009, 01:56   #6
valchakov
 
Регистрация: 23.12.2009
Сообщений: 3
По умолчанию

Цитата:
Сообщение от BOBAH13 Посмотреть сообщение
По теме. Реально ли из ехе загрузить 64х библиотеку ?(лично не пробовал пока)
Я так понимаю, если exe откомпилирован под 32-bit, то вызвать (загрузить) из него 64-bit нереально
valchakov вне форума Ответить с цитированием
Старый 25.12.2009, 02:09   #7
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

BOBAH13, если загрузчик сработает, то в принципе можно, главное прототип верно написать
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 25.12.2009, 10:29   #8
ZVano
 
Регистрация: 25.12.2009
Сообщений: 4
По умолчанию

Цитата:
Сообщение от valchakov Посмотреть сообщение
...
Можно ли написать 64-bit dll например в VS2008, которая будет подгружать имеющуюся 32-bit делфийскую dll, или 64-bit может вызывать только себе подобных?
...
Нет. Т.к. 32x dll будет загружена в адресное пространство 64x процесса. Следовательно все указатели будут 64x разрядными.
Допустим в основном процессе есть переменная myVar по адресу, превышающему 64 разряда (пусть это будет 2^32 + 100).

В библиотеке myDll32.dll есть функция
Код:
function DllFun_ReturnMe(_ParOf_myVar:Pointer):Pointer;
begin
  result := _ParOf_myVar;
end;
В основном процессе вызываем
Код:
DllFun_ReturnMe(@myVar);
Так вот, DllFun_ReturnMe принимает и фозвращает 32 бита, а основной процесс передает 64 бита. Капут.

Кроме того(насколько мне известно) тип Integer плавающий и зависит от разрядности. Т.е. в 32х разрядном приложении Integer 2^32, в 64х 2^64 (естественно, знаковое).

10:33

Нужно скомпилировать библиотеку под 64x.

Как это делается не скажу. Сам ищу способ скомпилить C++ dll в 64x при том, что ОС и проц у меня 32x.
+ то же самое под Linux

У нас принято пользоваться кнопочкой "Правка", дабы не плодить посты подряд, друг за другом.
Модератор

Последний раз редактировалось mihali4; 25.12.2009 в 13:22.
ZVano вне форума Ответить с цитированием
Старый 25.12.2009, 15:18   #9
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
Кроме того(насколько мне известно) тип Integer плавающий и зависит от разрядности. Т.е. в 32х разрядном приложении Integer 2^32, в 64х 2^64 (естественно, знаковое).
поэтому для тех кто не знает, существует LongInt и Int64;

Цитата:
Нет. Т.к. 32x dll будет загружена в адресное пространство 64x процесса. Следовательно все указатели будут 64x разрядными.
внутри DLL они так и останутся 32

в принципе можно, извратится до 64, но блин, на это столько сил уйдет(там нужны асмовые вставки еще), что проще переписпть на другой язык
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
С++: правильный импорт dll apromix Помощь студентам 1 04.10.2009 02:28
Импорт DLL в прогу cowboy Общие вопросы Delphi 5 14.04.2009 13:37
Vista Home Basic 64-bit NIKITUS Windows 4 31.03.2009 18:44