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