VC++动态链接库(DLL)编程深入浅出(三)
2009-11-24 21:01
337 查看
VC++动态链接库(DLL)编程深入浅出(三)
2009-11-05 12:24
2009-11-05 12:24
4.5 __stdcall约定 如果通过VC++编写的DLL欲被其他语言编写的程序调用,应将函数的调用方式声明为__stdcall方式,WINAPI都采用这种方式,而C/C++缺省的调用方式却为__cdecl。__stdcall方式与__cdecl对函数名最终生成符号的方式不同。若采用C编译方式(在C++中需将函数声明为extern "C"),__stdcall调用约定在输出函数名前面加下划线,后面加“@”符号和参数的字节数,形如_functionname@number;而__cdecl调用约定仅在输出函数名前面加下划线,形如_functionname。 Windows编程中常见的几种函数类型声明宏都是与__stdcall和__cdecl有关的(节选自windef.h): #define CALLBACK __stdcall //这就是传说中的回调函数 #define WINAPI __stdcall //这就是传说中的WINAPI #define WINAPIV __cdecl #define APIENTRY WINAPI //DllMain的入口就在这里 #define APIPRIVATE __stdcall #define PASCAL __stdcall 在lib.h中,应这样声明add函数: int __stdcall add(int x, int y); 在应用工程中函数指针类型应定义为: typedef int(__stdcall *lpAddFun)(int, int); 若在lib.h中将函数声明为__stdcall调用,而应用工程中仍使用typedef int (* lpAddFun)(int,int),运行时将发生错误(因为类型不匹配,在应用工程中仍然是缺省的__cdecl调用),弹出如图7所示的对话框。 [align=center]图7 调用约定不匹配时的运行错误[/align] 图8中的那段话实际上已经给出了错误的原因,即“This is usually a result of …”。 |
相关文章推荐
- VC++动态链接库((DLL)编程深入浅出(一)
- VC++动态链接库((DLL)编程深入浅出(一)
- VC++动态链接库(DLL)编程深入浅出之二(1)——非MFC dll
- VC++动态链接库(DLL)编程深入浅出
- VC++动态链接库(DLL)编程深入浅出(三)
- VC++动态链接库(DLL)编程深入浅出(一)
- (转)VC++动态链接库(DLL)编程深入浅出(二)
- [下载]VC++动态链接库(DLL)编程深入浅出
- VC++动态链接库(DLL)编程深入浅出(二)(中)
- VC++动态链接库(DLL)编程深入浅出(一)
- VC++动态链接库(DLL)编程深入浅出
- VC++动态链接库(DLL)编程深入浅出(四)
- VC++动态链接库(DLL)编程深入浅出
- 【转帖】VC++动态链接库(DLL)编程深入浅出
- VC++动态链接库(DLL)编程深入浅出(三)
- VC++动态链接库(DLL)编程深入浅出(zz)
- VC++动态链接库(DLL)编程深入浅出(三)
- VC++动态链接库(DLL)编程深入浅出(zz)
- VC++动态链接库((DLL)编程深入浅出(一)
- VC++动态链接库(DLL)编程深入浅出(一)