Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> При компиляции под x64 изменился экспорт библ-ки 
V
    Опции темы
ksili
Дата 29.9.2009, 06:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2069
Регистрация: 3.11.2005
Где: Красноярск

Репутация: 1
Всего: 17



Прошу вашей помощи, т.к. у меня самого 64-битного компа с 64-битной ОСью нет. Мне надо понять как исправить ошибку, а другой человек у себя это будет проверять. Поэтому буду рад любым замечаниям.

Есть одна и та же DLL скомпилированная под 32 и 64 бита. 
Под 32 бита всё работает. Под 64 бита не получается вызвать нужную функцию. Сравнил таблицы экспорта и обнаружил, что изменился прототип функции. Под 32 бита было:
Код

int __stdcall MyFunc(unsigned long,struct HWND__ *)

а под 64 стало:
Код

int __cdecl MyFunc(unsigned long,struct HWND__ * __ptr64)

Т.е. __stdcall превратился в __cdecl. Получается надо получать адрес функции уже по-другому. Раньше это делалось так:
Код

    BOOL (WINAPI *MyFuncProc)(DWORD dwThreadId, HWND wndServerWindow);
    (FARPROC&)MyFuncProc = GetProcAddress(hookDll, "MyFunc");

Видимо под 64 бита WINAPI это __cdecl, в то время как под 32 бита это __stdcall. Т.е. теперь, я думаю, как минимум стоит указать явно __cdecl вместо WINAPI:
Код

    BOOL (__cdecl *MyFuncProc)(DWORD dwThreadId, HWND wndServerWindow);
    (FARPROC&)MyFuncProc = GetProcAddress(hookDll, "MyFunc");

Или даже в самом объявлении функции обойтись без WINAPI, а указать явно __stdcall или __cdecl.
Кроме того, я не знаю, влияет ли на что-то изменение в объявлении записи второго аргумента со struct HWND__ * на struct HWND__ * __ptr64. Надо ли в связи с этим тоже что-то менять? 

Указанный код выполняется только в 64-битном приложении применительно к 64-битной DLL.


--------------------
Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с)
PM MAIL   Вверх
ksili
Дата 29.9.2009, 09:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2069
Регистрация: 3.11.2005
Где: Красноярск

Репутация: 1
Всего: 17



В MSDN в статье про __stdcall я нашёл следующее:
Цитата

On Itanium Processor Family (IPF) and x64 processors, __stdcall is accepted and ignored by the compiler;

И аналогично в статье про __cdecl:
Цитата

On Itanium Processor Family (IPF) and x64 processors, __cdecl is accepted and ignored by the compiler;

Чё-то я вообще не в понятках. Что тогда используется в x64?


--------------------
Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с)
PM MAIL   Вверх
Void
Дата 29.9.2009, 10:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λ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
PM MAIL WWW GTalk   Вверх
jonie
Дата 29.9.2009, 11:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 7
Всего: 118



Void, угу, там еще и RSP регистр (тот который в 32 бит зовется ESP) "не двигается" ... там много всякой фигни)

а по поводу "у меня нет винды 64 бит" - поставьте на вирт машину, например VMWare - она поддерживает ваиртуализацию процессора в том числе.


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
ksili
Дата 30.9.2009, 11:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2069
Регистрация: 3.11.2005
Где: Красноярск

Репутация: 1
Всего: 17



Спасибо за интересные ответы!

1) Насколько я понял чтобы не было проблем с calling convention под 64 бита надо при объявлении функции ничего про это не указывать. Ну и соответственно функции GetProcAddress подсовывать прототип безо всякого указания calling convention. Я правильно понял?

2) Скажите, какой дефайн определён в 64-битной винде? Это чтобы написать типа:
Код

#ifdef __WIN32
BOOL WINAPI MyFunc(DWORD dwThreadId, HWND wndServerWindow) {
#elif __X64
BOOL MyFunc(DWORD dwThreadId, HWND wndServerWindow) {
#endif


3) VMWare действительно может эмулировать 64-битный проц на 32-битном под 32-битной виндой? Я вроде уже спрашивал про такую возможность виртуалок, но мне что-то ничего не ответили. У меня есть Sun VirtualBox 2.1.0, там к сожалению процессор не указывается.


--------------------
Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с)
PM MAIL   Вверх
Void
Дата 30.9.2009, 11:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

Репутация: нет
Всего: 173



Цитата(ksili @  30.9.2009,  13:03 Найти цитируемый пост)
VMWare действительно может эмулировать 64-битный проц на 32-битном под 32-битной виндой? Я вроде уже спрашивал про такую возможность виртуалок, но мне что-то ничего не ответили. У меня есть Sun VirtualBox 2.1.0, там к сожалению процессор не указывается.

Нет. VMWare и VirtualBox могут держать 64-битную гостевую систему под 32-битным хостом, но при условии что процессор 64-битный и поддерживает аппаратные расширения виртуализации.


--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
ksili
Дата 30.9.2009, 11:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2069
Регистрация: 3.11.2005
Где: Красноярск

Репутация: 1
Всего: 17



Цитата(Void @  30.9.2009,  15:06 Найти цитируемый пост)
VMWare и VirtualBox могут держать 64-битную гостевую систему под 32-битным хостом, но при условии что процессор 64-битный и поддерживает аппаратные расширения виртуализации.

Подойдет ли такой процессор: Turion 64 X2? Не могу там найти про поддержку аппаратных расширений виртуализации.

Добавлено через 5 минут и 41 секунду
Цитата(ksili @  30.9.2009,  15:34 Найти цитируемый пост)
Не могу там найти про поддержку аппаратных расширений виртуализации.

нашел, вроде поддерживает  smile 

Как насчёт

Цитата(ksili @  30.9.2009,  15:03 Найти цитируемый пост)

1) Насколько я понял чтобы не было проблем с calling convention под 64 бита надо при объявлении функции ничего про это не указывать. Ну и соответственно функции GetProcAddress подсовывать прототип безо всякого указания calling convention. Я правильно понял?
2) Скажите, какой дефайн определён в 64-битной винде?




--------------------
Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с)
PM MAIL   Вверх
ksili
Дата 30.9.2009, 12:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2069
Регистрация: 3.11.2005
Где: Красноярск

Репутация: 1
Всего: 17



Ну вроде нашёл - _WIN64. Теперь буду пробовать.

Это сообщение отредактировал(а) ksili - 30.9.2009, 12:08


--------------------
Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с)
PM MAIL   Вверх
ksili
Дата 1.10.2009, 10:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2069
Регистрация: 3.11.2005
Где: Красноярск

Репутация: 1
Всего: 17



Не сработало.

Кто-нибудь может подсказать утилиту, которая хорошо разбирает PE-формат 64-разрядных файлов?


--------------------
Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с)
PM MAIL   Вверх
jonie
Дата 1.10.2009, 14:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 7
Всего: 118



http://ru.wikipedia.org/wiki/Hiew
дожен быть неплох


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0514 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.