VC开发笔记(持续更新)

问题1、CString.GetLength()

在Unicode下,字母、汉字等均为1,返回的是纯字符个数;

在MBCS下,字母为1,汉字等其他字符为2;

两种情况下,遇到\0都返回。 

=================================================================================

问题2:VS2005 cannot add ATL Simple Object into a ATL Project?

ATL classes can only be added to MFC EXE and MFC Regular DLL projects or projects with full ATL support.

ATL类只能添加到MFCexe和MFC规则dll项目中。

解决方案:

出现此问题最根本的原因是tlbref.dll没有在你的系统环境变量中

1、在系统环境变量,系统变量PATH中添加:你的VS2005安装路径\SDK\v2.0\bin或者复制tlbref.dll到你的系统目录下

2、删除你的解决方案的ncb文件并且重启VS2005

 MSDN官方回答:

Hi! 

We've analyzed the problem reported by Bill Armstrong (see below) and determined that the root cause of the issue is that tlbref.dll is not in the path. It is located in the .NET SDK directory (<install dir>\SDK\v2.0\bin). The workaround is rather simple: add that directory to your system path, or copy tlbref.dll to somewhere in the path. You will also have to delete the .NCB file for your project and re-open it in the IDE.

Without knowing your exact problem, I can't say whether it will help you or not. What caused the problem in Bills case were the #imports in his solution. If you used that construct, chances are, you're running into the same issue.

Regards,
Andras Tantos
Visual C++ IDE Team

 

=================================================================================

问题3:数字转字符串

atoi只能转成整数,atof只能转浮点数,对于一个未知字符数或未确定是整数还是浮点数的字符串,atoiatof均无用,用C++中流的方式可以很好的解决此问题。

#include<sstream>

using namespace std;

ostringstream ss;

ss<<-1<<222<<-1234<<-12.345;

string s = ss.str();

注意:ostringstream::str()函数返回的是一个临时对象,不能类似ss.str().c_str()使用。

 

=================================================================================

 

问题4、MFC对话框按下Enter键后消失

原因:由于默认输入Enter键时,系统会调用OnOK()函数,CDialog::OnOK()是一个可以让对话框退出的函数。

解决方案:重写OnOK()函数。

 

=================================================================================

问题5、__cdecl、__stdcall、__fastcall、__pascal、__thiscall区别

1.__cdecl
       所谓的C调用规则。按从右至左的顺序压参数入栈,由调用者把参数弹出栈。切记:对于传送参数的内存栈是由调用者来维护的。返回值在EAX因此,对于象printf这样变参数的函数必须用这种规则。编译器在编译的时候对这种调用规则的函数生成修饰名的饿时候,仅在输出函数名前加上一个下划线前缀,格式为_functionname。 
2.__stdcall 
        按从右至左的顺序压参数入栈,由被调用者把参数弹出栈。_stdcall是Pascal程序的缺省调用方式,通常用于Win32 Api中,切记:函数自己在退出时清空堆栈,返回值在EAX。 __stdcall调用约定在输出函数名前加上一个下划线前缀,后面加上一个“@”符号和其参数的字节数,格式为_functionname@number。如函数int func(int a, double b)的修饰名是_func@12
3.__fastcall
       __fastcall调用的主要特点就是快,因为它是通过寄存器来传送参数的(实际上,它ECXEDX传送前两个双字(DWORD)或更小的参数,剩下的参数仍旧自右向左压栈传送,被调用的函数在返回前清理传送参数的内存栈)。__fastcall调用约定在输出函数名前加上一个“@”符号,后面也是一个“@”符号和其参数的字节数,格式为@functionname@number。这个和__stdcall很象,唯一差别就是头两个参数通过寄存器传送。注意通过寄存器传送的两个参数是从左向右的,即第一个参数进ECX,第2个进EDX,其他参数是从右向左的入stack。返回仍然通过EAX.
4.__pascal
       这种规则从左向右传递参数,通过EAX返回,堆栈由被调用者清除

5.__thiscall

        仅仅应用于"C++"成员函数this指针存放于CX寄存器,参数从右到左压。thiscall不是关键词,因此不能被程序员指定

 

=================================================================================

 

转载于:https://www.cnblogs.com/woniuysniu/archive/2012/04/02/2429645.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值