• VC++ 知识点


    1、寻找文件时,CFileFind类的使用。

    2、寻找目录时使用BROWSEINFO,其中包含了用户选中目录的重要信息。

    3、LPITEMIDLIST类

    4、目录选择对话框的使用SHBrowseForFolder配合BROWSEINFO结构体,使用方法如下:

    http://baike.baidu.com/link?url=62Gqm5c5HMz5T2Hw4WD6hEKJk3mtkgOyTzyreHBPdgya6x04Hwm02Vdof0LhjYG7KlISUyK1N8RT7JGSQn5bXq#2 百度百科

    5、一定要得对变量初始化,例如char buf[255] = {0};否则可能会出现字符串无效

    6、类型转换,往往项目设置使用UNICODE时,但是C++中有些函数使用的却是char*的类型,这样,类型转换非常麻烦,LPSTR被定义成是一个指向以NULL(‘’)结尾的8位ANSI字符数组指针,而LPWSTR是一个指向以NULL结尾的16位双字节字符数组指针

    SOCKET编程:

    使用socket时的注意事项
    使用socket时,有几个必须注意的地方。
    那是include文件和库的指定,及socket库的初始化。

    include文件和库
    include文件是、库是ws2_32.lib

    socket库的初始化
    使用socket关联的函数前,执行下面的初始化的操作是必要的。
    WORD wVersionRequested = MAKEWORD(2,2);
    WSADATA wsaData[1];
    if(WSAStartup(wVersionRequested,wsaData)){
    printf("socket库的初始化失败。");
    exit(1);
    }

    7、对于所有的函数都要通过其返回值来判断其是否执行正确。如果不正确要对错误情况进行处理。

    8、关于字符,除特别指明需要char的,字符均定义为TCHAR,使用CString类时需要初始化。另外尽量使用STL中的string来操作字符串。

    9、变量在用到处声明,定义之后一定要做初始化。

    10、公共使用的函数可以作为全局函数,添加全局函数一般放在app中,声明在app的.h文件中,定义在app的.cpp文件中,因为app的.h文件是所有文件都要包含的。

    11、要养成写规范代码的习惯,变量的命名需要注意,还有*、&符号紧跟变量。

    12、对于重复出现的代码,要将其提炼出来形成函数,尽量不要让代码中存在重复的代码段。

    13、对学习编程者的忠告:
    眼过千遍不如手过一遍!
    书看千行不如手敲一行!
    手敲千行不如单步一行!
    单步源代码千行不如单步对应汇编一行!

    单步类的实例“构造”或“复制”或“作为函数参数”或“作为函数返回值返回”或“参加各种运算”或“退出作用域”的语句对应的汇编代码几步后,就会来到该类的“构造函数”或“复制构造函数”或“运算符重载”或“析构函数”对应的C/C++源代码处。

    VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化,这样过一遍不就啥都明白了吗。
    对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。

    14、
    //记录软件异常信息
    void ErrorLog(LPCTSTR szMsg)
    {
    try
    {
    TCHAR szPath[MAX_PATH] = {''};

    if (!::GetModuleFileName(NULL, szPath, MAX_PATH))
    {
    return;
    }

    ::PathRemoveFileSpec(szPath);

    TCHAR fileName[MAX_PATH] = {0};
    StringCchPrintf(fileName, _countof(fileName), _T("%s\Error.log"), szPath);

    CTime tm = CTime::GetCurrentTime();

    TCHAR szBuffer[1024] = {0};
    StringCchPrintf(szBuffer, _countof(szBuffer), _T("%d年%d月%d日%d:%d:%d:%s "), tm.GetYear(),
    tm.GetMonth(),
    tm.GetDay(),
    tm.GetHour(),
    tm.GetMinute(),
    tm.GetSecond(),
    szMsg);

    CFileStatus status;
    CStdioFile stFile;
    BOOL bOpen;


    if (!CFile::GetStatus(fileName,status))
    {
    bOpen = stFile.Open(fileName, CFile::modeCreate |CFile::modeWrite);
    }
    else
    {
    bOpen = stFile.Open(fileName, CFile::modeWrite);
    }

    if (bOpen)
    {
    stFile.SeekToEnd();

    char* old_locale = _strdup( setlocale(LC_CTYPE,NULL) );

    setlocale( LC_CTYPE, "chs" );

    stFile.WriteString(szBuffer);

    setlocale( LC_CTYPE, old_locale );

    free( old_locale );//还原区域设定

    stFile.Close();
    }
    }
    catch(...)
    {
    }
    }

    15、获取当前执行程序的路径,GetModuleFileName();和GetCurrentDirectory();

    GetBuffer和ReleaseBuffer是一套需要配合使用的函数,与GetBufferLength相比,优点是如果分配的空间大于实际保存的字符串,ReleaseBuffer会把多余申请的空间释放掉,归还给系统。
    GetBufferSetLength很好理解,就是申请指定长度的空间。

    16、C++对象的创建有以下4种方式: http://blog.csdn.net/my_mao/article/details/22863247

    Class A
    {
    ...
    };
    A a0; 调用默认的无参构造函数
    A a1(1); 隐式调用带有一个参数的构造函数
    A a2 = A(2); 显式调用一个参数的构造函数
    A *a3 = new A(3); 动态分配

    17、字节顺序转换函数
    htons:将一个u_short类型的端口从主机字节顺序转换为网络字节顺序
    ntohs:将一个u_short类型的端口从网络字节顺序转换为主机字节顺序

    htonl:将一个u_long类型的IP地址从主机字节顺序转换为网络字节顺序
    ntohl:将一个u_long类型的IP地址从网络字节顺序转换为主机字节顺序

    inet_addr:将一个字符串IP转换为以网络字节顺序排列的的IP地址
    inet_ntoa:将一个以网络字节顺序排列的IP地址转换为一个字符串IP

    18、
    爱MFC、爱MSDN。
    爱面向对象,爱属性和方法,最爱自己的名字后面有个加加。
    爱自己苦思冥想,也爱和众生分享。
    我不是无所不能的百科全书,也不是10块钱一本的如来神掌,我是Visual C++编程之道。
    别拿我和其他书相比,我和他们不一样。

    19、
    C++中的函数指针
    函数指针的定义方法如下:
    返回类型 (*指针名)(形参类型 形参名, ...);
    p表示一个函数指针,它指向接受一个int型形参的函数,这个函数的返回类型为int .
    这里要注意的是它不能写成 int *p(int x),这时p不再是函数指针,而是一个函数名,它接受int类型形参,返回类型为指向int类型的指针

    指针数组
    char* p[MAXNUM];

    20、Unix下网络编程和Windows下网路编程的区别
    Unix下有五种I/O 模型
    阻塞I/O模型
    非阻塞I/O模型
    I/O复用(select和poll)
    信号驱动I/Open
    异步I/O
    Windows支持的各种Socket I/O模型
    select 模型
    WSAAsyncSelect模型
    WSAEventSelect模型
    OverLapped I/O事件通知模型
    OverLapped I/O完成例程模型
    IOCP模型

    21、MFC中控件变量和控件值变量的区别,控件变量不需要使用Update(),Update()是和控件值变量结合使用的。

    22、WSA开头的函数是Window Socket API的缩写,都是API函数。WIN95以后的Window版本都支持winsock2.2,但是Window CE只支持winsock1.1,区分两个版本很简单,WinSock2.2的函数都以WSA开头,除了WSAStartup、WSACleanup、WSARecvEx、WSAGetLastError这几个函数也出现在1.1版本中。

    23、以Afx开头的函数被成为Afx框架函数,它们都是调用系统API函数实现的。

    24、发送自定义的消息有两个方法:SendMessage()、PostMessage()

    它们的区别是,SendMessage直接将消息发送给消息响应函数,消息响应函数处理之后,sendMessage()才返回。

    PostMessage()是把消息放到消息队列中,之后PostMessage就返回了。

    25、消息映射,消息使用ON_MESSAGE宏实现,命令消息使用OM_COMMAND宏实现。

    26、UpdateData(BOOL bFlag);的用法,此函数是用来刷新数据的,当参数为TRUE是表示将数据从控件刷新到对应变量中,为FALSE表示将数据从变量刷新到对应控件上。

  • 相关阅读:
    【java】JDBC连接MySQL
    【java】网络socket编程简单示例
    【java】对象序列化Serializable、transient
    【java】扫描流Scanner接收输入示例
    【java】缓冲字符字节输入输出流:java.io.BufferedReader、java.io.BufferedWriter、java.io.BufferedInputStream、java.io.BufferedOutputStream
    【java】System成员输入输出功能out、in、err
    33-Java中的String,StringBuilder,StringBuffer三者的区别
    5-Error:failed to find Build Tools revision 28.0.0 rc1解决方案
    46-wxpython 4 使用 grid 展示表格
    45-暴力密码字典
  • 原文地址:https://www.cnblogs.com/lit10050528/p/3624187.html
Copyright © 2020-2023  润新知