目录

非常用API函数

PROCESSENTRY32 存放快照进程信息的结构体

头文件 #include"tlhelp32.h"

CreateToolhelp32Snapshot函数

获取系统中正在运行的进程信息,线程信息等。

详细内容见此

1
2
3
4
HANDLE WINAPI CreateToolhelp32Snapshot(
  _In_ DWORD dwFlags,       //用来指定“快照”中需要返回的对象,可以是TH32CS_SNAPPROCESS等
  _In_ DWORD th32ProcessID  //一个进程ID号,用来指定要获取哪一个进程的快照,当获取系统进程列表或获取 当前进程快照时可以设为0
);

Process32First 进程获取函数(第一个)

当我们利用函数CreateToolhelp32Snapshot()获得当前运行进程的快照后,我们可以利用process32First函数来获得第一个进程的句柄。

1
2
3
4
BOOL WINAPI Process32First(
    HANDLE hSnapshot,//_in  从CreateToolhelp32Snapshot 返回的句柄。
    LPPROCESSENTRY32 lppe//_out  指向PROCESSENTRY32结构的指针。
);

Process32Next 进程获取函数(下一个)

当我们利用函数CreateToolhelp32Snapshot()获得当前运行进程的快照后,我们可以利用Process32Next函数来获得下一个进程的句柄。

1
2
3
4
BOOL WINAPI Process32Next(
  __in HANDLE hSnapshot,	//从CreateToolhelp32Snapshot 返回的句柄。
  __out LPPROCESSENTRY32 lppe  //指向PROCESSENTRY32结构的指针。
);

strcpy 字符串比较

用于ANSI标准字符串

这是用于ANSI标准字符串的函数(如string和char *),此函数接受两个字符串缓冲区做为参数,如果两个字符串是相同的则返回零。否则若第一个传入的字符串的值大于第二个字符串返回值将会大于零,若传入的第一个字符串的值小于第二个字符串返回值将小于零。

1
char *strcpy(char *strDestination, const char *strSource);  
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
//实例
char *ch="翔翔糖糖";
if(strcmp(ch,"翔翔糖糖")==0)
{
  undefined //字符串相等
}
else
{
  undefined	//字符串不相等
}

wcscpy 字符串比较

用于Unicode标准字符串

它的使用方法和strcmp相同,它用来比较两个Unicode字符串是否相等(如wstring和wchar_t *)。

wcscpy()即为strcpy()的宽字符版本,与_T类似的

1
wchar_t *wcscpy(wchar_t *strDestination, const wchar_t *strSource); 
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
//实例
wchar_t *ch=L"翔翔糖糖";
if(wcscmp(ch,L"翔翔糖糖")==0)
{
  undefined //字符串相等
}
else
{
  undefined	//字符串不相等
}

_tcscmp 字符串比较

_tcscpy 在编译时会根据条件被替换

如果是 ANSI工程,则使用 strcpy

如果是UNICODE工程,则使用wcscpy

1
2
3
4
5
#ifdef UNICODE   
    #define _tcscpy     wcscpy  
#else  
    #define _tcscpy     strcpy  
#endif 

EnumWindows 枚举顶层窗口

该函数枚举所有屏幕上的顶层窗口,并将窗口句柄传送给应用程序定义的回调函数。回调函数返回FALSE将停止枚举,否则EnumWindows函数继续到所有顶层窗口枚举完为止。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
//函数原型
BOOL WINAPI EnumWindows(
    _In_ WNDENUMPROC lpEnumFunc,//为回调函数
    _In_ LPARAM lParam	//传递给回调函数
);

//回调函数原型
BOOL CALLBACK EnumWindowsProc(
  HWND hwnd,	//枚举到的窗口句柄
  LPARAM lParam	//EnumWindows传递过来的参数
);

EnumWindows中的参数:lpEnumFunc回调函数,lParam参数传递给回调函数的lParam。回调函数中的参数:hwnd枚举到的窗口句柄,lParamEnumWindows传递过来的参数。

EnumChildWindows 枚举子控件

功能:枚举指定控件下的所有子控件,并将子控件句柄传送给应用程序定义的回调函数,回调函数返回FALSE将停止枚举,否则一直到所有子控件枚举完为止。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
//函数原型:
BOOL EnumChildWindows(
  HWND hWndParent, //为目标控件所在的父控件句柄
  WNDENUMPROC lpEnumFunc, //为回调函数
  LPARAM lParam	//传递给回调函数
);

//回调函数原型:
BOOL CALLBACK EnumChildProc(
  HWND hwnd, //枚举到的子控件句柄
  LPARAM lParam //EnumChildWindows传递过来的参数
);

EnumChildWindows中的参数:hWndParent为目标控件所在的父控件句柄;lpEnumFunc为回调函数;lParam传递给回调函数。回调函数中的参数:hwnd枚举到的子控件句柄,lParamEnumChildWindows传递过来的参数。

如果hWndParent参数为NULL,则此函数等效于EnumWindows。

SetTimer 设置定时器

1
2
3
4
5
SetTimer(	
		1,		//定时器ID
		5000,	//时间
		NULL  //调用的函数
);	

KillTimer 关闭定时器

1
KillTimer(1);//定时器编号

AfxExtractSubString 分割字符串(MFC专用)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
//原型
BOOL AfxExtractSubString(
  CString& rString, //保存输出的子字符串
  LPCTSTR lpszFullString, //待分割的字符串
  int iSubString, //提取的子字符串的序号,从0开始。假如你想提取第3段,该参数就输入2
  TCHAR chSep //用于分割的字符,默认的是'\n' 
);//返回值: 分割成功,就返回TRUE;iSubString越界,则返回FALSE


//实例
CString str = _T("abc45,78ea,679u,368");
CString strSub;
AfxExtractSubString(strSub, (LPCTSTR)str, 0, ',');  // strSub的内容为abc45
AfxExtractSubString(strSub, (LPCTSTR)str, 3, ',');  // strSub的内容为368

注意:用于分割的只能是字符,不能是字符串。

多个字符使用_tcstok函数。

AfxBeginThread 启动线程(MFC专用)

1
2
3
4
5
6
7
8
CWinThread* AfxBeginThread(
    AFX_THREADPROC pfnThreadProc,	//指向工作线程的控制函数。 指针不能为 NULL 。
    LPVOID pParam,	//要传递到控制函数的参数。
    int nPriority = THREAD_PRIORITY_NORMAL,	//要为线程设置的优先级。
    UINT nStackSize = 0,	//指定新线程堆栈的大小(以字节为单位)
    DWORD dwCreateFlags = 0,	//指定控制线程创建的其他标志。
    LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL);	//指向一个 SECURITY_ATTRIBUTES 结构,该结构指定线程的安全特性
//返回值:指向新创建的线程对象的指针; NULL 如果发生失败,则为。

[MFC 大漠.xmind](../../../../../../iCloud~net~xmind~brownieapp/Documents/辅助/脚本/MFC 大漠.xmind)

PostMessage 发送消息(不等待直接返回)

在窗口的消息队列中放置一条消息,然后返回而不等待相应的窗口处理该消息。

1
2
3
4
5
BOOL PostMessage(
    UINT message,				//指定要发布的消息。
    WPARAM wParam = 0,	//指定其他消息信息
    LPARAM lParam = 0);	//指定其他消息信息
//返回值: 如果发送消息成功,则为非零值;否则为0。

_beginthread, _beginthreadex 创建线程(通用)

详情

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
uintptr_t _beginthread( // NATIVE CODE
   void( __cdecl *start_address )( void * ),
   unsigned stack_size,
   void *arglist	
);
uintptr_t _beginthread( // MANAGED CODE
   void( __clrcall *start_address )( void * ),
   unsigned stack_size,
   void *arglist
);
uintptr_t _beginthreadex( // NATIVE CODE
   void *security,//指向 SECURITY_ATTRIBUTES 结构的指针,
   unsigned stack_size,//新线程的堆栈大小或 0。
   unsigned ( __stdcall *start_address )( void * ),//启动开始执行新线程的例程的地址
   void *arglist,//要传递到新线程的参数列表,或 NULL 。
   unsigned initflag,//控制新线程的初始状态的标志。 
   unsigned *thrdaddr//指向接收线程标识符的 32 位变量。
);
uintptr_t _beginthreadex( // MANAGED CODE
   void *security,
   unsigned stack_size,
   unsigned ( __clrcall *start_address )( void * ),
   void *arglist,
   unsigned initflag,
   unsigned *thrdaddr
);
//返回值 如果成功,则这些函数中的每一个都会返回一个句柄到新创建的线程

//实例
m_hThreadHandle = (HANDLE)::_beginthreadex(NULL,0,ThreadFunction,this,0,&m_uThreadID);

_endthread、_endthreadex 终止线程

详情

1
2
3
4
void _endthread( void );
void _endthreadex(
   unsigned retval	//线程退出代码。
);

WaitForSingleObject 线程等待

详情 csdn

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
DWORD WaitForSingleObject(
  [in] HANDLE hHandle,	//需要等待线程的句柄
  [in] DWORD  dwMilliseconds //超时时间 一直等待用INFINITE
);
//返回值
//有三种返回类型
//WAIT_OBJECT_0, 表示等待的对象有信号(对线程来说,表示执行结束);
//WAIT_TIMEOUT, 表示等待指定时间内,对象一直没有信号(线程没执行完);
//WAIT_ABANDONED 表示对象有信号,但还是不能执行  一般是因为未获取到锁或其他原因


//实例
if (WaitForSingleObject(m_hThreadHandle,  INFINITE) == WAIT_TIMEOUT)//线程等待,可延时等待或者一直等待INFINITE
{
  return false;
}

实例

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
// ConsoleApplication1.cpp : 定义控制台应用程序的入口点。
//
 
#include "stdafx.h"
#include "stdio.h"
#include "windows.h"
#include <iostream>
using namespace std;
 
int i = 0;
DWORD WINAPI FunProc(LPVOID lpParameter);
 
DWORD WINAPI FunProc(LPVOID lpParameter)
{
	for (; i < 10; i++)
	{
		if (!(i % 10))
			cout << endl;
		else
			cout << i << endl;
	}
	return 0;
}
 
void main()
{
	cout << i << endl;
	HANDLE hThread;
	hThread = CreateThread(NULL, 0, FunProc, NULL, 0, NULL);
	DWORD dwRet = WaitForSingleObject(hThread, 1);
	if (dwRet == WAIT_OBJECT_0)
	{
		cout<< "创建的线程执行结束" << endl;
	}
	if (dwRet == WAIT_TIMEOUT)
	{
		cout<< "等待超时" << endl;
	}
	if (dwRet == WAIT_ABANDONED)
	{
		cout<< "Abandoned" << endl;
	}
	CloseHandle(hThread);
	system("pause");
}

输出结果有两种:

https://cdn.jsdelivr.net/gh/xinqinew/pic@main/img/70.png

https://cdn.jsdelivr.net/gh/xinqinew/pic@main/img/70-20211224155245826.png

这就是未能等到线程结束信号量的等待时间就耗光了。我们也可以将WaitForSingleObject的第二个参数设置为 INFINITE,就可以一直等待。

ASSERT(false) 断点

debug模式才生效

详情

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
//原型
assert(
   expression	//评估为非零 (true) 或 0 (false) 的纯量运算式 (包括指标运算式)。
);
void _assert(
   char const* message,	//要显示的讯息。
   char const* filename,	//判断提示失败之原始程式档的名称。
   unsigned line	//判断提示失败之原始程式档中的行号。
);
void _wassert(
   wchar_t const* message,
   wchar_t const* filename,
   unsigned line
);
//返回值: 当结果为false时,列印诊断资讯并中止程式。


//实例
ASSERT(false);//断点,debug模式才生效

纪元时间

1
2
time_t epoch_time = time(nullptr);
cout << "Epoch time: " << epoch_time << endl;

SafeDelete 释放指针

有析构函数的在析构函数中释放

没有的在类视图消息属性中释放

1
	SafeDelete(m_pOp); 

GetTickCount()  系统开启到现在的时间

单位,毫秒

类型转换

atoi—ASCII to integer,将字符串转换成整形,从数字或正负号开始转换,一直到非数字为止

itoa—integer to ASCII–将整形转换成字符串

atof—ascii to float–字符串转换成浮点型

atol—ascii to long—字符串转换成长整形

gcvt—浮点型转换成字符串(四舍五入)

strtod—字符串转换成浮点型

strtol—字符串转换成长整形

strtoul–字符串转换成无符号长整形

toascii—将整形转换成合法的ASCII码字符

_ttoi—可以将CString转换成整形

_itot_s—将int转换成char*

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
float n;
char *str = "12345.67";
n = atoi(str);	//将字符串转换成整形

CWnd * pWnd = (CWnd*)GetDlgItem(IDC_EDIT4) ;
CString strValue ;
pWnd->GetWindowText(strValue) ;
strValue.Replace(_T("sec"), _T("")) ;
int iValue = _ttoi(strValue) ;//将Cstring转换成int

TCHAR buffer[7] ;
_itot_s(iValue, buffer, 3, 10) ;//将int转换成char*

strValue.Format(_T("%s")) ;//将char*转换成CString
strValue = strValue + _T("sec") ;//CString实现字符串相加