在Windows CE DLL中使用__stdcall和__cdecl

时间:2012-09-07 13:52:00

标签: c++ dll windows-ce calling-convention

我有一个适用于Windows CE 6.0 x86的Visual Studio 2008 C ++ 03应用程序。我遇到一个问题,从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;
}

我意识到这可能是由许多不同的事情引起的,但我很好奇在DLL标头中使用__stdcall。在Windows CE中,默认(对于Windows API)为__cdecl。为什么这个库会使用__stdcall?这会产生不利影响吗?

实际上,为什么要指定一个调用约定?

由于

1 个答案:

答案 0 :(得分:2)

在Windows CE中,__stdcall是一个解析为__cdecl的宏。也就是说,它们指定相同的调用约定。你的问题在别处。使用调试器进行调查。

可能会指定一个调用约定,因为需要为DLL的桌面版本指定它,并且更容易保持两个目标的源代码相同,而不是使用没有实际效果的条件编译来混淆它。 / p>