请问在vc++中的LPCSTR 的定义是什么意思?还有_stdcall?不知道那位大哥能给我解释一下!!!不胜感激!!! LPCSTR 指向一个以"NULL"结束的WINDOWS字符串常量的指针LPCTSTR 指向一个以"NULL"结束的Unicode或Windows字符串常量的指针 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 _stdcall 函数调用时的参数传递方式。 LPCSTR 一个指向以0结尾的常量型字符串,在WINNT.h中的定义是这样的:typedef CONST CHAR * LPCTSTR_stdcall 是指函数调用时参数传递的方式,这种方式一般有两种,ANSI C 规定函数返回时由调用方清除参数(从栈中pop),_stdcall 一般指pascal调用,即由被调方清除。在windows程序中也可写作WINAPI,CALLBACK,PASCAL...etc. _decl C/C++的缺省调用协定,由调用者清理堆栈,这就是C/C++中可以使 用可变参数的函数的原因,所有参数自右至左入栈,生成的代码中 函数名有一个_(下划线)作前缀。 _stdcall (CALLBACK,WINAPI) Win32 API的调用协定,由被调用的函数清理堆栈,所有参数自右至 左入栈,生成的代码中函数名有一个_(下划线)作前缀一个@和参数总 字节数(十进制)作後缀。它不支持可变参数,但它产生的代码比 _cdecl的短,因为没有每次调用後的清理堆栈的代码。 _fastcall 即快速调用协定,由被调用的函数清理堆栈,第一和第二个参数在ECX 和EDX中传递,其他参数自右至左入栈。生成的代码中函数名有一个@ 和参数总字节数(十进制)作前缀。 thiscall C++成员函数的缺省调用协定,不能用于显式函数说明,由被调用的函 数清理堆栈,所有参数自右至左入栈,this在ECX中传递,由于它不能 在C语言中使用,所以没有C的换名规则。 ifdef _MAC#define CALLBACK PASCAL#define WINAPI CDECL#define WINAPIV CDECL#define APIENTRY WINAPI#define APIPRIVATE CDECL#ifdef _68K_#define PASCAL __pascal#else#define PASCAL#endif#elif (_MSC_VER >= 800) || defined(_STDCALL_SUPPORTED)#define CALLBACK __stdcall#define WINAPI __stdcall#define WINAPIV __cdecl#define APIENTRY WINAPI#define APIPRIVATE __stdcall#define PASCAL __stdcall#else#define CALLBACK#define WINAPI#define WINAPIV#define APIENTRY WINAPI#define APIPRIVATE#define PASCAL pascal#endifVisual C++中,可以在函数类型前加_cdecl,_stdcall或者_pascal来表示其调用规范(默认为_cdecl)。C++ Builder也支持_fastcall调用规范.调用规范影响编译器产生的给定函数名,参数传递的顺序(从右到左或从左到右),堆栈清理责任(调用者或者被调用者)以及参数传递机制(堆栈,CPU寄存器等)。将调用规范看成是函数类型的一部分是很重要的;不能用不兼容的调用规范将地址赋值给函数指针。例如:// 被调用函数是以int为参数,以int为返回值__stdcall int callee(int); // 调用函数以函数指针为参数void caller( __cdecl int(*ptr)(int)); // 在p中企图存储被调用函数地址的非法操作__cdecl int(*p)(int) = callee; // 出错 指针p和callee()的类型不兼容,因为它们有不同的调用规范。因此不能将被调用者的地址赋值给指针p,尽管两者有相同的返回值和参数列。 谢谢FLY_PIG大哥的教导!能不能问一句?可以给我你的电子邮件好不好!我对大哥的崇拜之情,有如滔滔江水联绵不觉,对你的景仰有如黄河泛滥,一发而不可收拾!!!大哥,一定要给我你的邮箱号码!小弟的邮箱是[email protected] ________ ,d888888888b, ________"""" _.-;' ,dP"' `"Qb, _.-'.' """" .' < ,d88buP" "Qud88b, < .' `. `. dP" 8' .. .. `8 "Qb \ `. `> `, dP" .::8 _ :.@; _ ;@.: _ 8::. "Qb `, `> /' / ,8' .::dP" `.' "Qb::. `8, /' /' /' `\ dP .:::8( `--^--' )8:::. Qb `\ /' `-,_ `\ 8' ::::"Qba,.., ,..,adP":::: `8 `-,_ ~-. /' ,8 ::::::,p`"" ""'q,:::::: 8, /' ~-. _-'/' ,d' .:::::,d' `b,:::::. `b,/' _-' ,-' `\ ,d' .::::::d' `b::::::. `b\ .-' `-,_ `\,d' q888q8b,8 ,p q, 8,d8p888p `b,\`-. `-,. d' d", ; `b, 8, ,8 ,d' ; ,"b `b `. `-,. .' ,8 8 ` ` `b, `b, ,d' ,d' ' ' 8 8 ,' .' ,' / q, `b, `b a88a. .a88a d' ,d' ,p/ ,' < `. `q, `b, 8 8.8 8 ,d" ,p'. < `. ; `"Q888`b, `Q8888P" "Q8888P' ,d'888P"' ; `._____ `_' "Q888P" "Q888P" `._; ____ """""""" """""""嘿嘿,,,,[email protected] 想找兼职,请大家推荐比较好的招聘网站,谢谢! 请问 Vc++ 里如何给程序设置快捷键? 求象QQ一样可以随意改变皮肤的code,急!!! 文件大小写转换问题,百分想送 进程外组件可以这样用吗? 请问各位大侠: 关于vc 快捷键???????? 为什么一个MDI程序不能响应任何键盘消息? 请问在VC中如何控制打印机?我从来没有做过这方面的东西,望大家赐教。 老掉牙的打开文件对话框 从哪里添加DirectDraw AppWizard?? 请问各位:哪里有<<windows程序设计>>电子书籍下载?点到有分! 打印机问题!!解决马上送分!
_stdcall 函数调用时的参数传递方式。
typedef CONST CHAR * LPCTSTR
_stdcall 是指函数调用时参数传递的方式,这种方式一般有两种,ANSI C 规定函数返回时由调用方清除参数(从栈中pop),_stdcall 一般指pascal调用,即由被调方清除。在windows程序中也可写作WINAPI,CALLBACK,PASCAL...etc.
C/C++的缺省调用协定,由调用者清理堆栈,这就是C/C++中可以使
用可变参数的函数的原因,所有参数自右至左入栈,生成的代码中
函数名有一个_(下划线)作前缀。
_stdcall (CALLBACK,WINAPI)
Win32 API的调用协定,由被调用的函数清理堆栈,所有参数自右至
左入栈,生成的代码中函数名有一个_(下划线)作前缀一个@和参数总
字节数(十进制)作後缀。它不支持可变参数,但它产生的代码比
_cdecl的短,因为没有每次调用後的清理堆栈的代码。
_fastcall
即快速调用协定,由被调用的函数清理堆栈,第一和第二个参数在ECX
和EDX中传递,其他参数自右至左入栈。生成的代码中函数名有一个@
和参数总字节数(十进制)作前缀。
thiscall
C++成员函数的缺省调用协定,不能用于显式函数说明,由被调用的函
数清理堆栈,所有参数自右至左入栈,this在ECX中传递,由于它不能
在C语言中使用,所以没有C的换名规则。 ifdef _MAC
#define CALLBACK PASCAL
#define WINAPI CDECL
#define WINAPIV CDECL
#define APIENTRY WINAPI
#define APIPRIVATE CDECL
#ifdef _68K_
#define PASCAL __pascal
#else
#define PASCAL
#endif
#elif (_MSC_VER >= 800) || defined(_STDCALL_SUPPORTED)
#define CALLBACK __stdcall
#define WINAPI __stdcall
#define WINAPIV __cdecl
#define APIENTRY WINAPI
#define APIPRIVATE __stdcall
#define PASCAL __stdcall
#else
#define CALLBACK
#define WINAPI
#define WINAPIV
#define APIENTRY WINAPI
#define APIPRIVATE
#define PASCAL pascal
#endifVisual C++中,可以在函数类型前加_cdecl,_stdcall或者_pascal来表示其调用规范(默认为_cdecl)。
C++ Builder也支持_fastcall调用规范.
调用规范影响编译器产生的给定函数名,参数传递的顺序(从右到左或从左到右),
堆栈清理责任(调用者或者被调用者)以及参数传递机制(堆栈,CPU寄存器等)。将调用规范看成是函数类型的一部分是很重要的;不能用不兼容的调用规范将地址赋值给函数指针。例如:// 被调用函数是以int为参数,以int为返回值
__stdcall int callee(int); // 调用函数以函数指针为参数
void caller( __cdecl int(*ptr)(int)); // 在p中企图存储被调用函数地址的非法操作
__cdecl int(*p)(int) = callee; // 出错 指针p和callee()的类型不兼容,因为它们有不同的调用规范。
因此不能将被调用者的地址赋值给指针p,尽管两者有相同的返回值和参数列。
我对大哥的崇拜之情,有如滔滔江水联绵不觉,对你的景仰有如黄河泛滥,一发而不可收拾!!!
大哥,一定要给我你的邮箱号码!
小弟的邮箱是[email protected]
"""" _.-;' ,dP"' `"Qb, _.-'.' """"
.' < ,d88buP" "Qud88b, < .'
`. `. dP" 8' .. .. `8 "Qb \ `.
`> `, dP" .::8 _ :.@; _ ;@.: _ 8::. "Qb `, `>
/' / ,8' .::dP" `.' "Qb::. `8, /' /'
/' `\ dP .:::8( `--^--' )8:::. Qb `\ /'
`-,_ `\ 8' ::::"Qba,.., ,..,adP":::: `8 `-,_
~-. /' ,8 ::::::,p`"" ""'q,:::::: 8, /' ~-.
_-'/' ,d' .:::::,d' `b,:::::. `b,/' _-'
,-' `\ ,d' .::::::d' `b::::::. `b\ .-'
`-,_ `\,d' q888q8b,8 ,p q, 8,d8p888p `b,\`-.
`-,. d' d", ; `b, 8, ,8 ,d' ; ,"b `b `. `-,.
.' ,8 8 ` ` `b, `b, ,d' ,d' ' ' 8 8 ,' .'
,' / q, `b, `b a88a. .a88a d' ,d' ,p/ ,'
< `. `q, `b, 8 8.8 8 ,d" ,p'. <
`. ; `"Q888`b, `Q8888P" "Q8888P' ,d'888P"' ; `.
_____ `_' "Q888P" "Q888P" `._; ____
"""""""" """""""
嘿嘿,,,,[email protected]