Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 22, средняя оценка - 4.82
ustus_alex
6 / 6 / 1
Регистрация: 22.11.2013
Сообщений: 118
Завершенные тесты: 1
#1

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

22.01.2014, 13:23. Просмотров 4105. Ответов 10
Метки нет (Все метки)

Доброго дня,

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

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

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

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

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

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

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

чтобы тотчас же применить на практике теоретический рецепт.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.01.2014, 13:23
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Загрузка 32 bit DLL в 64 bit DLL (C++):

64 bit double to 80 bit - C++
Есть double переменная надо сделать из неё 80 - битную переменную, в интернете нашёл только этот асмовский код но он не работает. void...

Загрузка переменной из DLL (GetProcAddress не берет значение переменной из *.dll) - C++
GetProcAddress не берет значение переменной из *.dll Не могу понять почему. Помогите. ------------------------- *********** ...

Кто может поделиться файлами ogg.dll, vorbis.dll и vorbisfile.dll - 32-х и 64-битными версиями? - C++
Движок перевожу на платформу Win64 и нужно, чтобы разрядность ЕХЕ и DLL совпадали, а в интернете искал 64-битные версии ogg.dll, vorbis.dll...

DLL загрузка - C++
Добрый день ! Как из папки загружать dll который нужен для кода ? Видел много способов но что-то все не-то Добавлено через 4 минуты ...

Неявная загрузка dll - C++
Здравствуйте дорогие форумчане, вопрос такой, когда я делаю неявную загрузку dll, подключаю в свойствах проекта lib файл. Вот допустим...

Динамическая загрузка DLL - C++
Доброго времени суток! Создал dll с добавление класса, как учили: http://msdn.microsoft.com/ru-ru/library/ms235636.aspx. Далее,...

10
NoMasters
Псевдослучайный
1764 / 1107 / 73
Регистрация: 13.09.2011
Сообщений: 3,143
22.01.2014, 14:56 #2
Не проще будет написать приложение-обёртку и общаться с ним по любому удобному IPC?

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

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

Цитата Сообщение от ustus_alex Посмотреть сообщение
Несколько дней курил мануалы на просторах msdn, stackoverflow и других ресурсов, но так и не нашел реализованного решения, в виде небольшого примера как это делается.
Соберите библиотеку под платформу x64.
Для ее клиентов это будет наилучшим вариантом, чем всякие грабли в
виде суррогатных процессов, IPC и прочего.
1
_lunar_
1304 / 1229 / 91
Регистрация: 03.05.2011
Сообщений: 2,914
Завершенные тесты: 1
22.01.2014, 18:53 #5
с 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
ustus_alex
6 / 6 / 1
Регистрация: 22.11.2013
Сообщений: 118
Завершенные тесты: 1
22.01.2014, 19:33  [ТС] #6
Цитата Сообщение от Убежденный Посмотреть сообщение
Грузить 32-битную dll в 64-битный процесс ? Забудьте.



Соберите библиотеку под платформу x64.
Для ее клиентов это будет наилучшим вариантом, чем всякие грабли в
виде суррогатных процессов, IPC и прочего.
в том то и проблема, что библиотеку 32bit не перекомпилировать в 64bit, так как даже у ее разработчиков нет исходного кода на с++. A, все из-за того, что библиотека генерируется одной очень редко распространненой программой на основе заложенной туда математической модели (что то вроде модели из блоков в matlab simulink) и программа эта доступна только в 32 битном виде и в ней нет заложенных функций генерации 64 битной библиотеки.
Отсюда и мучения с поисками примеров создания суррогатных процессов.
Без них мне никак не обойтись..
0
NoMasters
Псевдослучайный
1764 / 1107 / 73
Регистрация: 13.09.2011
Сообщений: 3,143
22.01.2014, 20:04 #7
Цитата Сообщение от ustus_alex Посмотреть сообщение
Так вот в том то вся и проблема, что не хватает для этого опыта, примера же найти не смог...
Опыта обмена данными между процессами? В простейшем варианте делов-то передать входные данные и забрать выходные.
Между тем, что мешает собирать основную софтину только под 32 бита? Пользователям проприетарщины не привыкать.
0
ustus_alex
6 / 6 / 1
Регистрация: 22.11.2013
Сообщений: 118
Завершенные тесты: 1
22.01.2014, 20:30  [ТС] #8
Цитата Сообщение от NoMasters Посмотреть сообщение
Опыта обмена данными между процессами? В простейшем варианте делов-то передать входные данные и забрать выходные.
Между тем, что мешает собирать основную софтину только под 32 бита? Пользователям проприетарщины не привыкать.
Да, именно так, опыта в межпроцессорном взаимодействии нет вообще.
И, до прошлой недели, не было вообще никакого опыта с работой с dll файлами.
Но, как говорится опыт дело наживное... особенно в условиях поставленной задачи.
Основную софтину 32 битную не взять, доступна только 64 битная...
Конечными же пользователями является только мой отдел.
Отсюда и столько никому не нужных заморочек.
Ну, а чтобы было понятнее, что за задача стоит..
Есть программа похожая отдаленно на симулинк, каждой компонент который называется фильтром(dll файл).
мне нужно из ранее написанного фильтра (64 bit ) получить в мой фильтр (64 bit ) поток данных с CAN шины, в потоке выделить нужный сигнал и произвести с ним цифровую обработку на основе предоставленной мне ранее dll (32 bit) , результат анализа передать в следующий за моим фильтром фильтр (64bit) .
0
Убежденный
Ушел с форума
Эксперт С++
15702 / 7212 / 1139
Регистрация: 02.05.2013
Сообщений: 11,637
Записей в блоге: 1
Завершенные тесты: 1
22.01.2014, 22:39 #9
Цитата Сообщение от 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
ustus_alex
6 / 6 / 1
Регистрация: 22.11.2013
Сообщений: 118
Завершенные тесты: 1
23.01.2014, 12:36  [ТС] #10
Цитата Сообщение от Убежденный Посмотреть сообщение
Тогда Вам нужно сделать примерно следующее - собрать 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
Убежденный
Ушел с форума
Эксперт С++
15702 / 7212 / 1139
Регистрация: 02.05.2013
Сообщений: 11,637
Записей в блоге: 1
Завершенные тесты: 1
23.01.2014, 12:42 #11
Цитата Сообщение от ustus_alex Посмотреть сообщение
Да уж, чувствую с последним абзацем задача становится вообще практически невыполнимой.
Технология COM умеет решать такие проблемы, там данные легко могут передаваться
через границы процессов любой разрядности, причем сами процессы могут быть
запущены на разных машинах... Но для этого Ваша dll-ка сама должна быть
COM-объектом, использовать только COM-совместимые типы и иметь библиотеку
типов (tlb), иначе ничего не выйдет.
1
23.01.2014, 12:42
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.01.2014, 12:42
Привет! Вот еще темы с ответами:

DLL in VC++. Создание, загрузка, использование. - C++
Как известно, в VC++ имеется несколько типов Dll: 1.Non-MFC DLLs; 2.Regular DLLs Statically Linked to MFC; 3.Regular DLLs Dynamically...

Загрузка DLL во время выполнения. - C++
У меня возникла проблема: написал DLL, теперь надо подключать его из внешней программы (тоже DLL). Первый способ с помощью LoadLibrary...

Точка входа в процедуру InterlockedCompareExchange64 не найдена в библиотеке DLL KERNEL32.DLL - C++
День добрый! При запуске моей программы (много моего кода + много разных сторонних dll) на WinXP SP2, получаем соответствующую ошибку...

Добавление своей dll в список dll подгружаемых процессом чужого процесса - C++
Вообще вопрос такой,как можно внедрить свою dll в список Import чужого не запущенного процесса?Не изменяя структуры файла.


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru