Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/103: Рейтинг темы: голосов - 103, средняя оценка - 4.83
6 / 6 / 1
Регистрация: 22.11.2013
Сообщений: 123

Загрузка 32 bit DLL в 64 bit DLL

22.01.2014, 13:23. Показов 21364. Ответов 12
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго дня,

в своем предыдущем посту я озадачивался вопросом о том, как можно прикрутить DLL файл в проект visual studio, для доступа к функциям библиотеки. Получил очень хороший ответ, разобрался в нем и реализовал небольшое консольное приложение для тестирование функциональности DLL.

Как же в последствии выяснилось, библиотека существует только в 32 разрядном виде и возможностей генерирования у разработчиков этой библиотеки, ее в 64 bit не существует в принципе.

По моему заданию мне нужно разработать 64 bit DLL (своего рода компонентный блок типа блока из simulink), в котором будут реализована вся функциональность 32 битной предоставленной мне библиотеки.
То есть как ни крути, а грузить ее в 64 битный процес надо...

Несколько дней курил мануалы на просторах msdn, stackoverflow и других ресурсов, но так и не нашел реализованного решения, в виде небольшого примера как это делается.

Так как в большинстве статей, говориться о том, что это сделать невозможно, задача интеграции разных процессов очень нетривиальна. Именно поэтой причине и вынес данный вопрос в отдельную тему, надеясь, что она будет интересной и остальным участникам.

Может кто-нибудь из форумчан сталкивался с подобной задачей и имеет некоторые наработки в ней?

Мне как новичку в c++ довольно сложно разобраться со статьей:
http://blog.mattmags.com/2007/... -bit-code/

чтобы тотчас же применить на практике теоретический рецепт.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
22.01.2014, 13:23
Ответы с готовыми решениями:

Java.lang.UnsatisfiedLinkError: xxxx.dll: Can't load IA 32-bit .dll on a AMD 64-bit platform
При работе с субд sybase iq необходима библиотека jconn4 и некая dbjdbc12.dll. Так вот почему-то оригинальный sybase клиент, написанный на...

Регистрация DLL через regsrv32 в 64 bit
Доброго. Есть ли отличия от семерки? Есть реально рабочая DLL которая работает в Win32(7,XP). В 8 пишет же, что DLL зарегистрирована,...

NAudio.dll не работает в Wi7 и Win8.1 64 bit
Добрый день Всем! В VB2005 на XP 32 bit писал программку по обработке звуковых данных с использованием буфера NAudio.dll, решил...

12
Псевдослучайный
1946 / 1146 / 98
Регистрация: 13.09.2011
Сообщений: 3,215
22.01.2014, 14:56
Не проще будет написать приложение-обёртку и общаться с ним по любому удобному IPC?

Добавлено через 49 секунд
Проглядел по диагонали статью по ссылке, там как раз об этом и говорят.
0
6 / 6 / 1
Регистрация: 22.11.2013
Сообщений: 123
22.01.2014, 15:12  [ТС]
Цитата Сообщение от NoMasters Посмотреть сообщение
Не проще будет написать приложение-обёртку и общаться с ним по любому удобному IPC?

Добавлено через 49 секунд
Проглядел по диагонали статью по ссылке, там как раз об этом и говорят.
Так вот в том то вся и проблема, что не хватает для этого опыта, примера же найти не смог...
И, как следствие, обратился к более опытному сообществу...
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
22.01.2014, 17:25
Цитата Сообщение от ustus_alex Посмотреть сообщение
По моему заданию мне нужно разработать 64 bit DLL (своего рода компонентный блок типа блока из simulink), в котором будут реализована вся функциональность 32 битной предоставленной мне библиотеки.
То есть как ни крути, а грузить ее в 64 битный процес надо.
Грузить 32-битную dll в 64-битный процесс ? Забудьте.

Цитата Сообщение от ustus_alex Посмотреть сообщение
Несколько дней курил мануалы на просторах msdn, stackoverflow и других ресурсов, но так и не нашел реализованного решения, в виде небольшого примера как это делается.
Соберите библиотеку под платформу x64.
Для ее клиентов это будет наилучшим вариантом, чем всякие грабли в
виде суррогатных процессов, IPC и прочего.
1
Эксперт С++
 Аватар для _lunar_
3701 / 2836 / 451
Регистрация: 03.05.2011
Сообщений: 5,193
Записей в блоге: 21
22.01.2014, 18:53
с MSDN
A 32-bit DLL cannot be injected into a 64-bit process, and a 64-bit DLL cannot be injected into a 32-bit process.
0
6 / 6 / 1
Регистрация: 22.11.2013
Сообщений: 123
22.01.2014, 19:33  [ТС]
Цитата Сообщение от Убежденный Посмотреть сообщение
Грузить 32-битную dll в 64-битный процесс ? Забудьте.



Соберите библиотеку под платформу x64.
Для ее клиентов это будет наилучшим вариантом, чем всякие грабли в
виде суррогатных процессов, IPC и прочего.
в том то и проблема, что библиотеку 32bit не перекомпилировать в 64bit, так как даже у ее разработчиков нет исходного кода на с++. A, все из-за того, что библиотека генерируется одной очень редко распространненой программой на основе заложенной туда математической модели (что то вроде модели из блоков в matlab simulink) и программа эта доступна только в 32 битном виде и в ней нет заложенных функций генерации 64 битной библиотеки.
Отсюда и мучения с поисками примеров создания суррогатных процессов.
Без них мне никак не обойтись..
0
Псевдослучайный
1946 / 1146 / 98
Регистрация: 13.09.2011
Сообщений: 3,215
22.01.2014, 20:04
Цитата Сообщение от ustus_alex Посмотреть сообщение
Так вот в том то вся и проблема, что не хватает для этого опыта, примера же найти не смог...
Опыта обмена данными между процессами? В простейшем варианте делов-то передать входные данные и забрать выходные.
Между тем, что мешает собирать основную софтину только под 32 бита? Пользователям проприетарщины не привыкать.
0
6 / 6 / 1
Регистрация: 22.11.2013
Сообщений: 123
22.01.2014, 20:30  [ТС]
Цитата Сообщение от NoMasters Посмотреть сообщение
Опыта обмена данными между процессами? В простейшем варианте делов-то передать входные данные и забрать выходные.
Между тем, что мешает собирать основную софтину только под 32 бита? Пользователям проприетарщины не привыкать.
Да, именно так, опыта в межпроцессорном взаимодействии нет вообще.
И, до прошлой недели, не было вообще никакого опыта с работой с dll файлами.
Но, как говорится опыт дело наживное... особенно в условиях поставленной задачи.
Основную софтину 32 битную не взять, доступна только 64 битная...
Конечными же пользователями является только мой отдел.
Отсюда и столько никому не нужных заморочек.
Ну, а чтобы было понятнее, что за задача стоит..
Есть программа похожая отдаленно на симулинк, каждой компонент который называется фильтром(dll файл).
мне нужно из ранее написанного фильтра (64 bit ) получить в мой фильтр (64 bit ) поток данных с CAN шины, в потоке выделить нужный сигнал и произвести с ним цифровую обработку на основе предоставленной мне ранее dll (32 bit) , результат анализа передать в следующий за моим фильтром фильтр (64bit) .
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
22.01.2014, 22:39
Цитата Сообщение от ustus_alex Посмотреть сообщение
в том то и проблема, что библиотеку 32bit не перекомпилировать в 64bit, так как даже у ее разработчиков нет исходного кода на с++.
Тогда Вам нужно сделать примерно следующее - собрать 64-битную версию dll-ки с точно
таким же API, как у 32-битной, чтобы 64-битные клиенты могли ее свободно загружать и
использовать, а настоящую 32-битную версию dll-ки загрузить в свой 32-битный процесс.
А потом наладить передачу данных между 64-битной dll-кой, загруженной в клиентский
64-битный процесс, и 32-битной dll-кой, загруженный в свой 32-битный процесс.

Последовательность вызовов в этом случае будет такой: клиент (64-бит), загрузив
64-битную dll-ку, будет вызывать оттуда некоторые функции, но реально эти функции
будут всего лишь "заглушками", которые сериализуют данные и передают вызов в
32-битный процесс, в который загружена настоящая 32-битная dll. В этом процессе
вызываются настоящие функции и выполняется реальная работа, после чего параметры
сериализуются обратно, в вызывающий процесс, и в итоге клиент получает результат.
Все так, как если бы он загружал настоящую 64-битную dll, если бы она существовала.

Не факт, что это удастся так легко реализовать. Например, если какая-то функция dll
возвращает указатель, Вам нужно будет воссоздать объект, на который он указывает, в
контексте вызывающего процесса. Есть и другие потенциальные проблемы - с синхронизацией,
например, или правами доступа к объектам.
1
6 / 6 / 1
Регистрация: 22.11.2013
Сообщений: 123
23.01.2014, 12:36  [ТС]
Цитата Сообщение от Убежденный Посмотреть сообщение
Тогда Вам нужно сделать примерно следующее - собрать 64-битную версию dll-ки с точно
таким же API, как у 32-битной, чтобы 64-битные клиенты могли ее свободно загружать и
использовать, а настоящую 32-битную версию dll-ки загрузить в свой 32-битный процесс.
А потом наладить передачу данных между 64-битной dll-кой, загруженной в клиентский
64-битный процесс, и 32-битной dll-кой, загруженный в свой 32-битный процесс.

Последовательность вызовов в этом случае будет такой: клиент (64-бит), загрузив
64-битную dll-ку, будет вызывать оттуда некоторые функции, но реально эти функции
будут всего лишь "заглушками", которые сериализуют данные и передают вызов в
32-битный процесс, в который загружена настоящая 32-битная dll. В этом процессе
вызываются настоящие функции и выполняется реальная работа, после чего параметры
сериализуются обратно, в вызывающий процесс, и в итоге клиент получает результат.
Все так, как если бы он загружал настоящую 64-битную dll, если бы она существовала.

Не факт, что это удастся так легко реализовать. Например, если какая-то функция dll
возвращает указатель, Вам нужно будет воссоздать объект, на который он указывает, в
контексте вызывающего процесса. Есть и другие потенциальные проблемы - с синхронизацией,
например, или правами доступа к объектам.
Да уж, чувствую с последним абзацем задача становится вообще практически невыполнимой...
Одна из функций в dll возвращает указатель на структуру, содержащую в себе элементы с указателями на другую структуру, а другая структура сожержит еще один указатель типа : const char * name.
Чтобы вывести значение этого указателя на константу, содержащего в себе информацию зашитую в dll о названии входов и выходов, мне потребовалось два дня эксперементов и чтения книг...
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
23.01.2014, 12:42
Цитата Сообщение от ustus_alex Посмотреть сообщение
Да уж, чувствую с последним абзацем задача становится вообще практически невыполнимой.
Технология COM умеет решать такие проблемы, там данные легко могут передаваться
через границы процессов любой разрядности, причем сами процессы могут быть
запущены на разных машинах... Но для этого Ваша dll-ка сама должна быть
COM-объектом, использовать только COM-совместимые типы и иметь библиотеку
типов (tlb), иначе ничего не выйдет.
1
143 / 27 / 4
Регистрация: 06.05.2019
Сообщений: 1,825
Записей в блоге: 4
24.04.2022, 05:27
Тоже стало интересно как такое сделать.
Цитата Сообщение от ustus_alex Посмотреть сообщение
Мне как новичку в c++ довольно сложно разобраться со статьей: https://blog.mattmags.com/2007... -bit-code/
Да там нету примеров через что крутить и с чего начать.
0
143 / 27 / 4
Регистрация: 06.05.2019
Сообщений: 1,825
Записей в блоге: 4
03.11.2022, 00:59
Цитата Сообщение от Убежденный Посмотреть сообщение
Технология COM умеет решать такие проблемы, там данные легко могут передаваться
через границы процессов любой разрядности, причем сами процессы могут быть
запущены на разных машинах... Но для этого Ваша dll-ка сама должна быть
COM-объектом, использовать только COM-совместимые типы и иметь библиотеку
типов (tlb), иначе ничего не выйдет.
как создать библиотеку COM?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
03.11.2022, 00:59
Помогаю со студенческими работами здесь

Обясните мне, если Windows 32 bit, процессор 64 bit, то работает ли 2-ое ядро?
Обясните мне, если ОС Windows 32 bit, процессор 64 bit, все программы установлены разумеется 32 бит, то я так понимаю работает только одно...

Разбиение на треугольники: разное поведение WinXP 32 bit и Win 7 64 bit
Добрый день. Народ, я даже знаю в какую тему постить.... Вобщем словил глюк следующего содержания. Решается задача, схема которой...

HP ProBook 6570b (под 64-bit) встанет ли на него Win 32-bit?
Здравствуйте! Необходим ноутбук, чтобы в нем был аппаратный COM-порт - специализированый софт требует, выбрали HP ProBook 6570b. Однако,...

Ноут Aspire 5560G: не ставится Windows 7 64-bit, в отличие от 32-bit
На сайту Acer драйвера на 64-битную версию. Три диска втыкал "Windows 7 SP1 64-bit" сейчас. Два из них только что записал на болванки. ...

Как узнать какая у меня винда (Windows XP SP3 2008): 32 bit или 64 bit?
Как узнать какая у меня винда (Windows XP SP3 2008): 32 bit или 64 bit?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru