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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Динамический вызов ф-ций, что я делаю не так? 
:(
    Опции темы
nic1986
Дата 1.7.2015, 13:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 43
Регистрация: 6.7.2009

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



Код

typedef int (*WINAPI dMessageBoxA)(HWND hWnd,LPCSTR lpText,LPCSTR lpCaption,UINT uType);

int _tmain(int argc, _TCHAR* argv[])
{
    HMODULE lib = LoadLibraryA("user32.dll");
    dMessageBoxA DM = (dMessageBoxA)GetProcAddress(lib, "MessageBoxA");
    DM(0, "", "", MB_OK);
    return 0;
}

студия мне рассказывает что соглашение о вызове не то(Run-Time Check Failure #0 - The value of ESP was not properly saved across a function call.  This is usually a result of calling a function declared with one calling convention with a function pointer declared with a different calling convention.).
Но ведь в в самом winuser.h оно прописано как  __stdcall Что же не так?  smile  smile  
PM MAIL   Вверх
xvr
Дата 1.7.2015, 13:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 40
Всего: 223



Цитата(nic1986 @  1.7.2015,  13:25 Найти цитируемый пост)
Но ведь в в самом winuser.h оно прописано как  __stdcall Что же не так?

MessageBox прописан, а не ваш typedef. Его вам надо прописать самим -
Код

typedef int (*WINAPI __stdcall dMessageBoxA)(HWND hWnd,LPCSTR lpText,LPCSTR lpCaption,UINT uType);

PM MAIL   Вверх
nic1986
Дата 1.7.2015, 17:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 43
Регистрация: 6.7.2009

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



xvr, Я вас не понял,у меня там и так соглашение о вызове __stdcall А проблема оказалась в багнутых настройках стека https://support.microsoft.com/en-us/kb/822039 Студия с каждой версией становиться все более корявой(((
PM MAIL   Вверх
xvr
Дата 2.7.2015, 12:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 40
Всего: 223



Цитата(nic1986 @  1.7.2015,  17:10 Найти цитируемый пост)
Я вас не понял,у меня там и так соглашение о вызове __stdcall 

У вас вообще отсуствует указание о соглашении вызова, поэтому берется соглашение по умолчанию из настроек проекта. Не факт, что это __stdcall.

Хотя поправка: WINAPI уже определен как __stdcall, так что должно работать. Может WINAPI где то переопределили?

Цитата(nic1986 @  1.7.2015,  17:10 Найти цитируемый пост)
А проблема оказалась в багнутых настройках стека

И где у вас параметр размером более 64К (о чем говорится по приведенной вами ссылке)?

PM MAIL   Вверх
nic1986
Дата 2.7.2015, 14:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 43
Регистрация: 6.7.2009

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



WINAPI и есть по умолчанию у студии, как __stdcall.Факт в том что вышеупомянутая ошибка появляется когда в настройках проекта стоит RTCs, когда RTCu то все ОК. Возможно какая то цртшная заглушка на точке входе загаживает стек, или еще какое то непотребство творит.
PM MAIL   Вверх
xvr
Дата 3.7.2015, 14:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 40
Всего: 223



Странно это. В студии конечно баги есть, но это уж очень большой баг, прямо дыра я бы сказал  smile 

Собрал ваш пример в VS2012. Получил warning на строке с typedef:

Цитата

c:\users\rakhvato\documents\projects\consoleapplication1\source.cpp(4): warning C4229: anachronism used : modifiers on data are ignored

Отсюда следует, что модификатор __stdcall (который в WINAPI) оно проигнорировало. Так что слом с RTCs вполне предсказуем.

Поменял typedef на 
Код

typedef int (WINAPI *dMessageBoxA)(HWND hWnd,LPCSTR lpText,LPCSTR lpCaption,UINT uType);

warning исчез

Запустил под дебагером c .RTCs - первый вариант сломался, второй нет. 

Так что ошибки лучше начинать искать со своей стороны, а не со стороны компилятора и IDE  smile 
PM MAIL   Вверх
nic1986
Дата 3.7.2015, 19:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 43
Регистрация: 6.7.2009

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



Не понял, что на что вы поменяли.
Код

typedef int(*__stdcall dMessageBoxA)(HWND hWnd, LPCSTR lpText, LPCSTR lpCaption, UINT uType);

int _tmain(int argc, _TCHAR* argv[])
{
    HMODULE lib = LoadLibraryA("user32.dll");
    dMessageBoxA DM = (dMessageBoxA)GetProcAddress(lib, "MessageBoxA");
    DM(0, "", "", MB_OK);
    return 0;
}

в релизе крашиться, судя по оллидебаг на RETN ф-ции точки входа,т.е. при срабатывание црт заглушки.

Это сообщение отредактировал(а) nic1986 - 3.7.2015, 19:59
PM MAIL   Вверх
volatile
Дата 3.7.2015, 22:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

Репутация: 13
Всего: 85



Цитата(nic1986 @  3.7.2015,  19:52 Найти цитируемый пост)
typedef int( * __stdcall * dMessageBoxA)(HWND hWnd, LPCSTR lpText, LPCSTR lpCaption, UINT uType);


Добавлено через 1 минуту и 55 секунд
nic1986, звездочку не там поставили.
смотрите как правильно ставить у xvr, 
PM MAIL   Вверх
nic1986
Дата 4.7.2015, 23:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 43
Регистрация: 6.7.2009

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



В мелких деталях вся суть, а так сразу и не заметишь  smile 
PM MAIL   Вверх
Alexeis
Дата 6.7.2015, 11:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

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



Мне вот интересно, звездочка перед __stdcall, что означала для компилятора? Он ее проигнорировал что ли?


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
GremlinProg
Дата 6.7.2015, 12:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



Цитата(Alexeis @  6.7.2015,  13:58 Найти цитируемый пост)
Мне вот интересно, звездочка перед __stdcall, что означала для компилятора? Он ее проигнорировал что ли? 

он ___stdcall после нее проигнорировал, т.к. обнаружил анахронизм:
Цитата

anachronism used : modifiers on data are ignored

Возможно, раньше можно было так писать smile

Добавлено через 3 минуты и 54 секунды
у меня, кстати, тоже первая мысль была, что это какая-то старая,доступная форма записи, из серии:
Код

const int x;
int const x;



--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "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.0544 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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