一点vc++汇总

1、CFormat 出错 

void bug()
{
    CString show;
    CTime starttime = CTime::GetCurrentTime();
    Sleep(100);
    CTime endtime = CTime::GetCurrentTime();

    long lstart = starttime.GetTime();
    long lend = endtime.GetTime();

    show.Format(_T("%d,%d"), starttime.GetTime(), endtime.GetTime()); // 数字,0
    show.Format(_T("%d,%d"), lstart, lend);        // 数字,数字
}

2、 vc++字符串转换
#include <atlconv.h> 
USES_CONVERSION;  // 只需要调用一次,就可以在函数中进行多次转换CT2A();
C:convert
W:wide
2:to
A:ASCII

在转换过程中使用的缓冲区大小。 默认长度为128个字节。
CW2A    将宽字符集(Unicode)转化为多字符集(ASCII)
CA2W    将多字符集(ASCII)转化为宽字符集(Unicode)


LPSTR = char *
LPCSTR = const char *
LPWSTR = wchar_t *
LPCWSTR = const wchar_t *
LPOLESTR = OLECHAR * = BSTR = LPWSTR(Win32)
LPCOLESTR = const OLECHAR * = LPCWSTR(Win32)
LPTSTR = _TCHAR *
LPCTSTR = const _TCHAR *

泛型转换宏:

每个宏的实现都使用 _alloca() 函数从堆栈而非堆中分配内存。 从堆栈中分配内存要比在堆上分配内存快得多,并且在退出该函数时,将自动释放内存。 此外,宏避免 MultiByteToWideChar 多次调用 (或 WideCharToMultiByte) 。 这可通过分配比所需内存量多一点的内存来实现。 我们知道,MBC 将转换为最多一个 WCHAR ,并且对于每个 WCHAR ,最多可有两个 MBC 字节。 通过分配比所需内存多一点但始终足以处理转换的内存,避免对转换函数进行第二次调用。 对 helper 函数的调用 AfxA2Whelper 会减少为执行转换而必须执行的参数推送的数目 (这将导致较小的代码,而不是 MultiByteToWideChar 直接)
LPWSTR->LPTSTR:      W2T();
LPTSTR->LPWSTR:      T2W();
LPCWSTR->LPCSTR:   W2CT();
LPCSTR->LPCWSTR:   T2CW();
ANSI->UNICODE:      A2W();
UNICODE->ANSI:      W2A();

(1)A2W的用法:
USES_CONVERSION;
CString tmpStr;
char*LineChar="fdsfdsa";
const WCHAR * cLineChar = A2W(LineChar);
tmpStr=cLineChar;
(2)W2A的用法:
USES_CONVERSION;
CString tmpStr;
WCH LineChar="fdsfdsa";
const char* cLineChar = A2W(LineChar);
2、A2T和T2A
(1)A2T的用法:
USES_CONVERSION;
char * pChar="char to cstring";
CString cTemp=A2T(pChar);
(2)T2A的用法:
USES_CONVERSION;
CString cTemp =_T("char to cstring");
char * pChar=A2T(pChar);

https://download.csdn.net/download/zhang3747782/11452238

 

3、进程互斥

// 创建互斥量
HANDLE m_hMutex = CreateMutex(NULL, FALSE, "名字");
if (GetLastError() == ERROR_ALREADY_EXISTS) // 检查错误代码
{   

 return FALSE;
}

..........
//加锁
WaitForSingleObject(hMutex, INFINITE); 
//解锁
ReleaseMutex(hMutex);

.........
程序关闭,关闭互斥量
CloseHandle(m_hMutex);
m_hMutex = NULL;


4、注册表

CWinApp::SetRegistryKey
void SetRegistryKey( LPCTSTR lpszRegistryKey );
void SetRegistryKey( UINT nIDRegistryKey );
lpszRegistryKey
字符串指针,包含了键的名字。
nIDRegistryKey
注册表中键的ID/索引。
这个函数将应用程序的设置保存在注册表而不是INI文件中。这个函数设置m_pszRegistry Key,它被CWinApp的成员函数GetProfileInt,GetProfileString,WriteProfileInt和WriteProfileString使用。如果调用了这个函数,最近使用(MRU)的文件也被保存到注册表中。通常注册表的键为公司的名字。它保存在如下形式的键中:HKEY_CURRENT_USER\Software\<公司名>\<应用程序名>\<section name>\<value name>.

5、

    int a = 0;
    (--a) = 10;     // 正常
    (a--) = 10;    //编译报错,  我的理解是这样的 10 可以看做成一个常整形,不能更改值

6   调试技巧

 TRACE  ASSERT  在查看变量时使用格式说明符(,10    ,hr    ,su), 内存窗口。

7  字符集

MBCS: 

它是多字节字符集,它是不定长表示世界文字的编码。MBCS表示英文字母时就和ASCII一样(这也是我们容易把MBCS和ASCII搞混的原因),但表示其他文字时就需要用多字节。

UNICODE:

 它是用两个字节表示一个字符的方法。比如字符'A'在ASCII下面是一个字符,可'A'在UNICODE下面是两个字符,高字符用0填充,而且汉字'程'在ASCII下面是两个字节,而在UNICODE下仍旧是两个字节。UNICODE的用处就是定长表示世界文字,据统计,用两个字节可以编码现存的所有文字而没有二义。

windows xp 以后的版本,内核都是采用NUICODE字符集,所以追求速度,程序采用UNICODE字符集。

8  函数调用是需要消耗时间的,直接访问地址更高效,建议简单函数使用inline函数。

9 引用挺耗费时间的,我的一个程序增加了一个引用的参数,导致跑飞。

10 messagebox

::MessageBox(AfxGetApp()->GetMainWnd()->m_hWnd, 
            _T("提示信息"), _T("提示信息"), MB_OK|MB_ICONWARNING);

(1)按钮组合常量
 MB_OK = $00000000;         //一个确定按钮
 MB_OKCANCEL = $00000001;      //一个确定按钮,一个取消按钮
 MB_ABORTRETRYIGNORE = $00000002;  //一个异常终止按钮,一个重试按钮,一个忽略按钮
 MB_YESNOCANCEL = $00000003;     //一个是按钮,一个否按钮,一个取消按钮
 MB_YESNO = $00000004;        //一个是按钮,一个否按钮
 MB_RETRYCANCEL = $00000005;     //一个重试按钮,一个取消按钮
 (2)缺省按钮常量
 MB_DEFBUTTON1 = $00000000;     //第一个按钮为缺省按钮
 MB_DEFBUTTON2 = $00000100;     //第二个按钮为缺省按钮
 MB_DEFBUTTON3 = $00000200;     //第三个按钮为缺省按钮
 MB_DEFBUTTON4 = $00000300;     //第四个按钮为缺省按钮
 (3)图标常量
 MB_ICONHAND = $00000010;        //“×”号图标
 MB_ICONQUESTION = $00000020;      //“?”号图标
 MB_ICONEXCLAMATION = $00000030;    //“!”号图标
 MB_ICONASTERISK = $00000040;      //“i”图标
 MB_USERICON = $00000080;        //用户图标
 MB_ICONWARNING = MB_ICONEXCLAMATION;  //“!”号图标
 MB_ICONERROR = MB_ICONHAND;      //“×”号图标
 MB_ICONINFORMATION = MB_ICONASTERISK; //“i”图标
 MB_ICONSTOP = MB_ICONHAND;       //“×”号图标
 (4)运行模式常量
 MB_APPLMODAL = $00000000;    //应用程序模式,在未结束对话框前也能切换到另一应用程序
 MB_SYSTEMMODAL = $00001000;   //系统模式,必须结束对话框后,才能做其他操作
 MB_TASKMODAL = $00002000;    //任务模式,在未结束对话框前也能切换到另一应用程序
 MB_HELP = $00004000;       //Help Button
 3、函数返回值
 0            //对话框建立失败
 IDOK = 1        //按确定按钮
 IDCANCEL = 2      //按取消按钮
 IDABOUT = 3       //按异常终止按钮
 IDRETRY = 4       //按重试按钮
 IDIGNORE = 5      //按忽略按钮
 IDYES = 6        //按是按钮
 IDNO = 7        //按否按钮 

 11 vector 是双向的

    std::vector<int >  vcInt;
    for (size_t i = 0; i < 20; i++)
    {
        vcInt.push_back(i);
    }
    std::vector<int>::iterator iter;
    iter = std::find(vcInt.begin(), vcInt.end(),   10);
    int predata = *(iter - 1);
    TRACE(_T("out put %d\r\n"),     predata);

12  WireShark 基本用法

ip.sic == 192.168.2.77 and tcp.port == 9100

https://www.cnblogs.com/dragonir/p/6219541.html

13 Bus Hound 串口必备。

14 资源

阿里图标:
https://www.iconfont.cn/
图标之家
http://www.icosky.com/

15

标识符前缀

说明

ID_

表示命令项或者菜单、工具项

IDB_

表示位图资源

IDC_

表示光标资源或者常用控件

IDD_

表示对话框资源

IDI_

表示图标资源

IDM_

表示菜单项

IDP_

表示消息框中使用的字符串

IDR_

表示快捷键或者菜单资源相关资源

IDS_

表示字符串标中的字符串

16  c ++ 11 tuple 元组

tuple容器(元组),是表示元组容器,是不包含任何结构的,快速而低质(粗制滥造)的,可以用于函数返回多个返回值,
tuple 容器,可以使用直接初始化,和 "make_tupel"初始化,访问元素使用 “get<>”方法,注意get里面包含位置信息,必须是常量表达式(const expression);
通过std::tuple_size<decltype(t)>::value 获取元素的数量

18 把 clw、ncb、aps文件删除 重编译 通过

19 C++ 中的 mutable 关键字
在C++中,mutable 是为了突破 const 的限制而设置的。可以用来修饰一个类的成员变量。被 mutable 修饰的变量,将永远处于可变的状态,即使是 const 函数中也可以改变这个变量的值。

20 cpu缓存

32位CPU与内存的最小交换数据为4字节/次,这也是结构体要对齐4字节的原因。
1.对于int,short,char,BOOL等小于等于4字节的简单数据类型,如果无逻辑上的先后关系,多线程读写可以完全不用加锁
2.尽管float为4字节,多线程访问时也需要加锁
3.对于大于4字节的简单类型,比如double,__int64等,多线程读写必须加锁。
4.对于所有复杂类型,比如类,结构体,容器等类型必须加锁
转载: https://blog.csdn.net/liuyueyue0921/article/details/48298471

1、多线程读取long long 数据,是正确的,使用两个变量累加,计算差值的方式。
2、多线程读取字符串也是正常的。

21  ping 不通

因为windows防火墙默认设置的是不让别人ping通的,所以方法就是,修改防火墙相关设置

步骤:控制面板 →  系统和安全 → Windows防火墙 → 高级设置 → 入站规则 → 文件和打印机共享(回显请求 - ICMPv4-In)设置为启用

23 EOF

在C语言中,或更精确地说成C标准函数库中表示文件结束符(end of file)。在while循环中以EOF作为文件结束标志,这种以EOF作为文件结束标志的文件,必须是文本文件。在文本文件中,数据都是以字符的ASCII代码值的形式存放。我们知道,ASCII代码值的范围是0~127,不可能出现-1,因此可以用EOF作为文件结束标志。
档案存取或其它 I/O 功能可能传回等于象征符号值 (巨集) EOF 指示档案结束的情形发生。实际上 EOF 的值通常为 -1,但它依系统有所不同。

24 标准输入输出

// 得到本进程的当前标准输出
HANDLE hRead; // 管道读句柄
HANDLE hWrite; // 管道写句柄
BOOL bRet = CreatePipe(&hRead, &hWrite, NULL, 0); // 创建匿名管道
HANDLE hTemp = GetStdHandle(STD_OUTPUT_HANDLE);
// 设置标准输出到匿名管道
SetStdHandle(STD_OUTPUT_HANDLE, hWrite);
WriteFile(hWrite, "aaaaaaaaaaa",12, &n, NULL);
SetStdHandle(STD_OUTPUT_HANDLE, hTemp); // 恢复本进程的标准输出

hTemp = GetStdHandle(STD_INPUT_HANDLE);
// 设置标准输出到匿名管道
SetStdHandle(STD_INPUT_HANDLE, hRead);
ReadFile(hRead, data, 1024, &n, NULL);
SetStdHandle(STD_INPUT_HANDLE, hTemp); // 恢复本进程的标准输出

25 vc++ 运行库选择

MFC的使用,有三种设置:
1.使用标准Windows库
2.在静态库中使用MFC:是将DLL中的相关代码写进EXE文件中,文件较大,但是可以在没有相关DLL的机器上运行;
3.在共享DLL中使用MFC:指的是打包时一些MFC的DLL的内容没有被包含在EXE文件中,所以EXE文件较小,但是运行时要求系统中要有相关的DLL文件;

多线程调试
/MD:在dll中使用多线程,创建动态链接库的release版本,需要选择。
/MT: 在exe里使用多线程,创建exe的release版本,需要选择。
/MTd:同/MT一样,不过是在Debug版本中使用。
/MDL:同/MD一样,不过是在Debug版本中使用。

如果是Debug的“在静态库中使用MFC”,不要使用MDd,改用MTd,然后编译即可通过。
如果是Debug的“在共享DLL中使用MFC”,注意不要使用MTd,改用MDd;
如果是Release版本“在静态库中使用MFC”,不要使用MD,使用MT;
如果是Release版本的“在共享DLL中使用MFC”,不要使用MT,使用MD。
原文地址:http://www.cnblogs.com/zwh0214/p/6048360.html

26、vs 内存释放最后开始。

堆,队列优先,先进先出。栈,先进后出(First-In/Last-Out)。

27、指针的引用

int a = 20;
int *&b = &a;// ok

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值