В xp 32bit эта строка компилируется без проблем, однако в Vista 64bit эта строка:
m_FuncAddr = ::GetProcAddress (somthing);
выдает следующую ошибку
ошибка C2440: '=': невозможно преобразовать из
От 'FARPROC' до 'int (__cdecl *) (void)'
GetProcAddress определяется как
WINBASEAPI FARPROC WINAPI GetProcAddress (somthing)
и m_FuncAddr как
int (WINAPI *m_FuncAddr)();
Из того, что я понимаю, оба являются стандартными.
Чтобы избежать ошибки пришлось поставить
m_FuncAddr = (int (__cdecl *)(void))::GetProcAddress(somthing);
Мой вопрос:
Если и m_FuncAddr, и GetProcAddress имеют соглашение о вызовах stdcall, почему я должен «вызывать» его с помощью cdecl?
Возможно ли, что в настройках проекта VS 'соглашение о вызовах по умолчанию (для которого установлено значение cdecl) переопределяет приведенный выше статус присвоения?
Заранее спасибо!
[Изменить]
Чтобы ответить на вопрос:
На одной стороне уравнения (скажем, на стороне 1) у меня есть
int __stdcall * m_FuncAddr
На другой стороне (сторона 2)
INT_PTR far __stdcall GetProcAddress
Так как же я должен разыграть сторону 2 с помощью cdecl, если оба являются stdcalls?
Или я что-то не понимаю?