![]() |
|
Модераторы: feodorv, GremlinProg, xvr, Fixin |
![]()
|
|
| ksili |
|
||||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2069 Регистрация: 3.11.2005 Где: Красноярск Репутация: 1 Всего: 17 |
Прошу вашей помощи, т.к. у меня самого 64-битного компа с 64-битной ОСью нет. Мне надо понять как исправить ошибку, а другой человек у себя это будет проверять. Поэтому буду рад любым замечаниям.
Есть одна и та же DLL скомпилированная под 32 и 64 бита. Под 32 бита всё работает. Под 64 бита не получается вызвать нужную функцию. Сравнил таблицы экспорта и обнаружил, что изменился прототип функции. Под 32 бита было:
а под 64 стало:
Т.е. __stdcall превратился в __cdecl. Получается надо получать адрес функции уже по-другому. Раньше это делалось так:
Видимо под 64 бита WINAPI это __cdecl, в то время как под 32 бита это __stdcall. Т.е. теперь, я думаю, как минимум стоит указать явно __cdecl вместо WINAPI:
Или даже в самом объявлении функции обойтись без WINAPI, а указать явно __stdcall или __cdecl. Кроме того, я не знаю, влияет ли на что-то изменение в объявлении записи второго аргумента со struct HWND__ * на struct HWND__ * __ptr64. Надо ли в связи с этим тоже что-то менять? Указанный код выполняется только в 64-битном приложении применительно к 64-битной DLL. -------------------- Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с) |
||||||||
|
|||||||||
| ksili |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2069 Регистрация: 3.11.2005 Где: Красноярск Репутация: 1 Всего: 17 |
В MSDN в статье про __stdcall я нашёл следующее:
И аналогично в статье про __cdecl:
Чё-то я вообще не в понятках. Что тогда используется в x64? -------------------- Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с) |
||||
|
|||||
| Void |
|
|||
![]() λcat.lolcat ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2206 Регистрация: 16.11.2004 Где: Zürich Репутация: нет Всего: 173 |
ksili, в Win x64 используется только один вид соглашений о вызове, не совпадающий ни с одним из 32-битных. Для передачи параметров используется до 8 регистров (RCX, RDX, R8, R9, XMM0-3).
Calling Convention Process for x64 64-Bit -------------------- “Coming back to where you started is not the same as never leaving.” — Terry Pratchett |
|||
|
||||
| jonie |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5613 Регистрация: 21.8.2005 Где: Владимир Репутация: 7 Всего: 118 |
Void, угу, там еще и RSP регистр (тот который в 32 бит зовется ESP) "не двигается" ... там много всякой фигни)
а по поводу "у меня нет винды 64 бит" - поставьте на вирт машину, например VMWare - она поддерживает ваиртуализацию процессора в том числе. -------------------- Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет... |
|||
|
||||
| ksili |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2069 Регистрация: 3.11.2005 Где: Красноярск Репутация: 1 Всего: 17 |
Спасибо за интересные ответы!
1) Насколько я понял чтобы не было проблем с calling convention под 64 бита надо при объявлении функции ничего про это не указывать. Ну и соответственно функции GetProcAddress подсовывать прототип безо всякого указания calling convention. Я правильно понял? 2) Скажите, какой дефайн определён в 64-битной винде? Это чтобы написать типа:
3) VMWare действительно может эмулировать 64-битный проц на 32-битном под 32-битной виндой? Я вроде уже спрашивал про такую возможность виртуалок, но мне что-то ничего не ответили. У меня есть Sun VirtualBox 2.1.0, там к сожалению процессор не указывается. -------------------- Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с) |
|||
|
||||
| Void |
|
|||
![]() λcat.lolcat ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2206 Регистрация: 16.11.2004 Где: Zürich Репутация: нет Всего: 173 |
Нет. VMWare и VirtualBox могут держать 64-битную гостевую систему под 32-битным хостом, но при условии что процессор 64-битный и поддерживает аппаратные расширения виртуализации. -------------------- “Coming back to where you started is not the same as never leaving.” — Terry Pratchett |
|||
|
||||
| ksili |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2069 Регистрация: 3.11.2005 Где: Красноярск Репутация: 1 Всего: 17 |
Подойдет ли такой процессор: Turion 64 X2? Не могу там найти про поддержку аппаратных расширений виртуализации. Добавлено через 5 минут и 41 секунду
нашел, вроде поддерживает Как насчёт -------------------- Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с) |
|||
|
||||
| ksili |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2069 Регистрация: 3.11.2005 Где: Красноярск Репутация: 1 Всего: 17 |
Ну вроде нашёл - _WIN64. Теперь буду пробовать.
Это сообщение отредактировал(а) ksili - 30.9.2009, 12:08 -------------------- Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с) |
|||
|
||||
| ksili |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2069 Регистрация: 3.11.2005 Где: Красноярск Репутация: 1 Всего: 17 |
Не сработало.
Кто-нибудь может подсказать утилиту, которая хорошо разбирает PE-формат 64-разрядных файлов? -------------------- Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с) |
|||
|
||||
| jonie |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5613 Регистрация: 21.8.2005 Где: Владимир Репутация: 7 Всего: 118 |
-------------------- Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет... |
|||
|
||||
![]()
|
| Правила форума "C/C++: Системное программирование и WinAPI" | |
|
|
На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы . Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |