stdcall проезжает визуальная студия? - PullRequest
4 голосов
/ 17 октября 2008

В 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? Или я что-то не понимаю?

Ответы [ 2 ]

3 голосов
/ 17 октября 2008

Тип возвращаемого значения должен быть INT_PTR (64-битное значение в 64-битных сборках). Вы не должны использовать эту ошибку - компилятор пытается сказать вам, что что-то не так.

Из WinDef.h:

#ifdef _WIN64
typedef INT_PTR (FAR WINAPI *FARPROC)();

Таким образом, объявление m_FuncAddr должно быть:

INT_PTR (WINAPI *m_FuncAddr)();
2 голосов
/ 17 октября 2008

Это совпадение, что он правильно компилируется в 32 бита; правильный синтаксис:

typedef int (WINAPI *FFuncType)();
FFuncType m_FuncAddr;
m_FuncAddr = (FFuncType)::GetProcAddress (somthing);

Вам необходимо явно привести результат :: GetProcAddress к правильной сигнатуре функции. В 32-битной версии FARPROC работает с вашей подписью, но, вероятно, не в 64-битной.

Edit: Да, на самом деле, глядя на windef.h, тип возвращаемого значения - INT_PTR в 64-битном, поэтому вы получили ошибку компилятора. Вам по-прежнему нужно приводить к сигнатуре функции, как указано выше, для любой функции, которая не соответствует заполнителю для FARPROC, поэтому вам следует делать это, как описано выше.

...