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

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

22.01.2014, 13:23. Показов 21500. Ответов 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,835
Записей в блоге: 4
24.04.2022, 05:27
Тоже стало интересно как такое сделать.
Цитата Сообщение от ustus_alex Посмотреть сообщение
Мне как новичку в c++ довольно сложно разобраться со статьей: https://blog.mattmags.com/2007... -bit-code/
Да там нету примеров через что крутить и с чего начать.
0
143 / 27 / 4
Регистрация: 06.05.2019
Сообщений: 1,835
Записей в блоге: 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
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru