为什么微软的__stdcall函数不乱名?
以下面这个函数为例:
extern "C" __declspec(dllexport) void DisplayD(int x)
{
std::cout<<x;
}
这样编译出来的DLL,用dumpbin /exports查看,函数名没有乱,正常
改成这样:
__declspec(dllexport) void DisplayD(int x),
函数名就乱了,虽然在导入模块的时候照着那个乱乱的函数名可以成功调用,但是这样很不爽
再改成这样,加一个__stdcall修饰符:
extern "C" __declspec(dllexport) void __stdcall DisplayD(int x)
函数名也乱了,说明__stdcall的优先级比extern "C要高啊,盖掉了extern "C"
我想问的是,为什么那些WINAPI的函数没有乱码,没有看到有DEF文件,是不是因为它们都是用C写的缘故?
在C里编译是不会有函数名乱乱的现象的是吗?
如果我拿到一个DLL,全是乱乱的函数名,难道我也只有被迫用乱乱的函数名了吗?有没有其它办法能够使用好好的名?
extern "C" __declspec(dllexport) void DisplayD(int x)
{
std::cout<<x;
}
这样编译出来的DLL,用dumpbin /exports查看,函数名没有乱,正常
改成这样:
__declspec(dllexport) void DisplayD(int x),
函数名就乱了,虽然在导入模块的时候照着那个乱乱的函数名可以成功调用,但是这样很不爽
再改成这样,加一个__stdcall修饰符:
extern "C" __declspec(dllexport) void __stdcall DisplayD(int x)
函数名也乱了,说明__stdcall的优先级比extern "C要高啊,盖掉了extern "C"
我想问的是,为什么那些WINAPI的函数没有乱码,没有看到有DEF文件,是不是因为它们都是用C写的缘故?
在C里编译是不会有函数名乱乱的现象的是吗?
如果我拿到一个DLL,全是乱乱的函数名,难道我也只有被迫用乱乱的函数名了吗?有没有其它办法能够使用好好的名?
...全文
相关推荐
关于函数调用方式__stdcall和__cdecl详解
下面小编就为大家带来一篇关于函数调用方式__stdcall和__cdecl详解。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
函数的调用规则(__cdecl,__stdcall,__fastcall,__pascal)
函数的调用规则(__cdecl,__stdcall,__fastcall,__pascal) 关于函数的调用规则(调用约定),大多数时候是不需要了解的,但是如果需要跨语言的编程,比如VC写的dll要delphi调用,则需要了解。 microsoft的vc默认的是__cdecl方式,而windows API则是__stdcall,如果用vc开发dll给其他语言用,则应该指定__stdcall方式。堆栈由谁清除这个很重要,如果是要写汇编函数给C调用,一定要小心堆栈的清除工作,如果是__cdecl方式的函数,则函数本身(如果不用汇编写)则不需要关心保存参数的堆栈的清除,但是如果是__stdcall的规则,一定要在函数退出(ret)前恢复堆栈。
stdcall介绍
stdcall的用法详解,常见的调用约定有:stdcall,cdecl,fastcall,thiscall,naked call
__stdcall 和 __cdecl 的区别浅析
__stdcall 和 __cdecl 的区别浅析,需要的朋友可以参考一下
stdcall与 cdecl
stdcall cdecl 函数调用方式详解


进程/线程/DLL
