У меня есть приложение Visual Studio 2008 C ++ 03 для Windows CE 6.0 x86. У меня проблема, когда вызов функции из DLL вызывает исключение нарушения прав доступа, но только в режиме отладки.
// DLL header
extern "C" BOOL __stdcall Foo( const wchar_t*, const wchar_t*, wchar_t*, unsigned long );
// program
#include "foo.h"#pragma comment( lib, "foo.lib" )
int main()
{
wchar_t f[ 100 ];
Foo( L"something", L"nothing", f, countof( f ) ); // access violation
return 0;
}
Я понимаю, что это может быть вызвано множеством разных вещей, но мне любопытно использовать __stdcall
в заголовке DLL. В Windows CE по умолчанию (для Windows API) __cdecl
, Почему эта библиотека использует __stdcall
? Может ли это иметь отрицательный эффект?
На самом деле, зачем вообще указывать соглашение о вызовах?
Спасибо
В Windows CE __stdcall
это макрос, который разрешает в __cdecl
, То есть они обозначают одни и те же соглашения о вызовах. Ваша проблема лежит в другом месте. Используйте отладчик для расследования.
Соглашение о вызовах может быть указано, потому что оно должно быть указано для настольной версии DLL, и легче сохранить исходный код одинаковым для обеих целей, чем загромождать его условной компиляцией, которая не имеет реального эффекта.
Других решений пока нет …