![](https://img-blog.csdnimg.cn/20201014180756930.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Win32API
文章平均质量分 55
CherishPrecious
追求技术的道路永无止境。
展开
-
函数GetCurrentDirectory与GetModuleFileName的区别
生动的解释:当前工作目录——进行某项操作的目的目录,会随着OpenFileDialog、SaveFileDialog等对象所确定的目录而改变。(变化的)当前执行文件目录——该进程从中启动的目录,即文件自身所在目录。(固定的) 形象的比喻:工作目录与执行目录可以不同。例如一个人住在北京,但他的工作地点不一定在北京,可能在天津。 具体的用法: TCHAR szExe[...原创 2018-08-05 10:15:27 · 326 阅读 · 0 评论 -
设置控制台颜色SetConsoleColor
//字体颜色+背景颜色#include<windows.h>#include<iostream>#include<iomanip>using namespace std;BOOL SetConsoleColor(WORD wAttr){ HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE); ...原创 2018-08-14 12:44:47 · 1115 阅读 · 0 评论 -
WinInet和FTP
WinInet和FTP(1)WinInet接口(含HTTP、FTP)及FTP函数层次关系(2)Ftp函数介绍 ①InternetOpen——初始化,它告诉 Internet DLL 初始化内部数据结构并准备接收应用程序之后的其他调用。 参数 含义 LPCTSTR lpszAgent 调用WinInet函数的...原创 2018-08-14 12:45:57 · 783 阅读 · 0 评论 -
深入解析结构化异常处理(SEH)
尽管以前写过一篇SEH相关的文章《关于SEH的简单总结》, 但那真的只是皮毛,一直对Windows异常处理的原理似懂非懂, 看了下面的文章 ,一切都豁然开朗. 1997年文章,Windows技术的根一直没变: http://www.microsoft.com/msj/0197/exception/exception.aspxMatt Pietrek 著 董岩 译 在Win32操作系统...原创 2018-08-16 15:45:16 · 428 阅读 · 0 评论 -
内核对象的“遗弃”
一.什么是“遗弃”问题互斥量常用于多进程之间的线程互斥,所以它比关键段还多一个很有用的特性——“遗弃”情况的处理。比如有一个占用互斥量的线程在调用ReleaseMutex()触发互斥量前就意外终止了(相当于该互斥量被“遗弃”了),那么所有等待这个互斥量的线程是否会由于该互斥量无法被触发而陷入一个无穷的等待过程中了?这显然不合理。因为占用某个互斥量的线程既然终止了那足以证明它不再使用被该互斥量保...原创 2018-11-07 09:30:33 · 114 阅读 · 0 评论 -
双线程读写队列数据
MFC对话框中一个按钮的响应函数实现两个功能:显示数据同时处理数据,因此开两个线程,一个线程显示数据(开了一个定时器,响应WM_TIMER消息按照一定时间间隔向TeeChart图表添加数据并显示)同时在队列队尾添加数据,另一个线程从该队列队头去数据来处理。下面就来解决这个案例。先来分析下:这个案例是一个线程向队列中的队列头部读取数据,一个线程向队列中的队列尾部写入数据。看起来很像读者写者...原创 2018-11-07 09:34:06 · 973 阅读 · 0 评论 -
多字节字符与宽字符
多字节字符集——每个字符的编码宽度不一,可为一个字节或多个字节。 (1)ASCII字符只占一个字节 (2)对于中文、日文等用两个字节 (3)一个字符串中,如何区分哪个是中文字符,那个是ASCII字符呢? “Windows程序设计”16进制(10进制)的编码 W i n d o ...原创 2018-11-07 12:46:53 · 2826 阅读 · 0 评论 -
字符和字符串处理(1)
2.1 字符集及字符编码(字符集——字符的集合,不同的字符集,收录的字符可能不同)2.1.1多字节字符集及ANSI编码标准(1)单字节编码:ASCII字符集及扩展——满足英语及西欧语言的需要(2)双字节编码:——满足亚洲等国家语言文字的需要,如: 字符编码及 代码页 第1字节 (前导字节Lead Byte及最高位) ...原创 2018-11-07 12:50:37 · 362 阅读 · 0 评论 -
字符和字符串处理(2)
2.5 安全字符串函数 不安全的字符串函数 Strsafe函数 Safe CRT函数 (C运行库) strcpy, wcscpy, _tcscpy, _mbscpy, strcpy , lstrcpy, _tccpy, _mbccpy StringCchCopy StringCbCopy ...原创 2018-11-07 12:54:26 · 551 阅读 · 0 评论 -
StringCchCopy与StringCchCat的配合使用
实现的功能:获取当前可执行文件的当前工作目录,拼接文件名,生成可读写文本文件的完整路径。判断该文件是否存在,如果存在则进行删除操作。 示例代码如下: TCHAR szExe[MAX_PATH]; memset(szExe, 0, sizeof(TCHAR)*MAX_PATH); GetModuleFileName(NULL, szExe, MAX_PATH); Messa...原创 2018-11-07 12:55:46 · 168 阅读 · 0 评论 -
四个线程写四个文件01 Semaphore + Event
题目:有四个线程1、2、3、4。线程1的功能就是输出1,线程2的功能就是输出2,以此类推.........现在有四个文件ABCD。初始都为空。现要让四个文件呈如下格式:A:1 2 3 4 1 2....B:2 3 4 1 2 3....C:3 4 1 2 3 4....D:4 1 2 3 4 1....请设计程序。解答:我的思路是这样的:当每个子线程准备就绪后,主线程发出前进一步的命令【...原创 2018-11-07 12:57:02 · 142 阅读 · 0 评论 -
四个线程写四个文件02 Semaphore = Event * 4
但是我有一个担心,当举旗时,4个线程至少有一个线程不在等待该旗子时【因为线程调度不可预知】,这样某个线程在某次命令中会不会多跑一圈?而那个掉队的线程就跑不了,导致死锁。试验:把threadfunc改成下面的代码,即让SetEvent和WaitForSingleObject有个不确定的间隔。跑了七八下,结果都正确。但是再跑一下,死锁真的发生了。所以这个现象是比较难以重复的。 UINT W...原创 2018-11-07 12:58:40 · 119 阅读 · 0 评论 -
生产者消费者问题(Producer:1、Consumer:1、Buffer:1)
生产者消费者问题是一个著名的线程同步问题,该问题描述如下:有一个生产者在生产产品,这些产品将提供给若干个消费者去消费,为了使生产者和消费者能并发执行,在两者之间设置一个具有多个缓冲区的缓冲池,生产者将它生产的产品放入一个缓冲区中,消费者可以从缓冲区中取走产品进行消费,显然生产者和消费者之间必须保持同步,即不允许消费者到一个空的缓冲区中取产品,也不允许生产者向一个已经放入产品的缓冲区中再次投放产...原创 2018-11-07 13:00:15 · 524 阅读 · 0 评论 -
生产者消费者问题(Producer:1、Consumer:2、Buffer:4)
现在将消费者改成2个,缓冲池改成拥有4个缓冲区的大缓冲池。 如何来思考了这个问题了?首先根据上面分析的二点,可以知道生产者和消费者由一个变成多个的影响不大,唯一要注意的是缓冲池变大了,回顾一下之前提到的信号量,不难得出用二个信号量就可以解决这种缓冲池有多个缓冲区的情况——用一个信号量A来记录为空的缓冲区个数,另一个信号量B记录非空的缓冲区个数,然后生产者等待信号量A,消费者等待信号量B就...原创 2018-11-07 13:01:43 · 517 阅读 · 0 评论 -
一个经典的多线程同步问题05 信号量Semaphore
//创建信号量HANDLE CreateSemaphore( LPSECURITY_ATTRIBUTES lpSemaphoreAttributes, LONG lInitialCount, LONG lMaximumCount, LPCTSTR lpName);函数说明:第一个参数表示安全控制,一般直接传入NULL。第二个参数表示初始资源数量。第...原创 2018-08-14 12:43:28 · 223 阅读 · 0 评论 -
一个经典的多线程同步问题04 互斥量Mutex
//创建互斥量(注意与事件Event的创建函数对比)HANDLECreateMutex( LPSECURITY_ATTRIBUTESlpMutexAttributes, BOOLbInitialOwner, LPCTSTRlpName);函数说明:第一个参数表示安全控制,一般直接传入NULL。第二个参数用来确定互斥量的初始拥有者。如果传入TRUE表...原创 2018-08-14 12:42:22 · 241 阅读 · 0 评论 -
获得桌面的ListView控件窗口句柄的方法
XP://桌面的ListView控件是ProgMan窗口的孙子窗口hWndLV = GetFirstChild(GetFirstChild(FindWindow(TEXT("ProgMan"),NULL)));Win8: HWND GetDestopListViewHandle(){ HWND hWnd = NULL,hWndItem; HWND hW...原创 2018-08-05 10:17:00 · 803 阅读 · 0 评论 -
创建远程线程
(1)用VirtualAllocEx函数在远程进程的地址空间中分配一块内存。(2)用WriteProcessMemory函数反映Dll的路径名复制到第1步分配的内存中(3)用GetProcAddress函数来得到LoadLibrary W(或A)函数在Kernel32.dll的真实地址。(4)用CreateRemoteThread函数在远程进程中创建一个线程,让新线程调用正确的Lo...原创 2018-08-05 10:18:29 · 1926 阅读 · 0 评论 -
StringCbCopy和StringCchCopy的用法及区别
StringCbCopy函数用于拷贝string,且提供了目标缓冲区的大小作为参数,防止缓冲区溢出等安全问题。这个函数可用于替换以下函数的使用:strcpy, wcscpy, _tcscpy,lstrcpy,StrCpyStringCbCopy函数原型如下:HRESULT StringCbCopy( __out LPTSTR pszDest, //目标字符串缓冲区 _...原创 2018-08-05 10:19:17 · 1168 阅读 · 0 评论 -
SetWindowLong函数
SetWindowLong函数用来改变指定窗口的属性LONG WINAPI SetWindowLong( __in HWND hWnd, //指定窗口的句柄,或者间接地,窗口所属的类 __in int nIndex, //指定要设置的属性值的偏移地址 __in LONG dwNewLong //指定设置的新值);参数nIndex的取值如下:GWL_EXSTYLE ...原创 2018-08-06 12:29:06 · 1507 阅读 · 0 评论 -
GetObject函数用法详解
GetObject函数用于从指定的图形对象中获取信息,原型如下: int GetObject( __in HGDIOBJ hgdiobj, //图形对象的句柄 __in int cbBuffer, //将写入到缓冲区中的图形对象信息的字节数 __out LPVOID lpvObject //指向接收图形对象信息的缓冲区的指针 ...原创 2018-08-06 12:26:40 · 13795 阅读 · 0 评论 -
DisableThreadLibraryCalls函数
DisableThreadLibraryCalls函数用于使指定DLL的DLL_THREAD_ATTACH和DLL_THREAD_DETACH通知无效,这可减少某些应用程序的工作集空间。原型如下:BOOL WINAPI DisableThreadLibraryCalls( __in HMODULE hModule//Dll的句柄);参数hModule是指定DLL模块的句柄,可以使...原创 2018-08-06 12:27:55 · 270 阅读 · 0 评论 -
GetSystemTime和GetFileTime
FILETIME结构包含了文件或目录的日期和时间信息:(自1601年1月1日以来,单位为100纳秒)typedefstruct _FILETIME { DWORD dwLowDateTime; //低32位 DWORD dwHighDateTime; //高32位} FILETIME, *PFILETIME; SYSTEMTIME结构包含了用户可识别的系统日期信息:...原创 2018-08-06 12:31:48 · 403 阅读 · 0 评论 -
MultiByteToWideChar和WideCharToMultiByte
MultiByteToWideChar将多字节字符串转换为宽字符字符串,函数原型如下:int MultiByteToWideChar( __in UINT CodePage, //与多字节字符串关联的一个代码页值,一般设为CP_ACP __in DWORD dwFlags, //指定额外的转换控制,一般为0 __in LPCSTR lpMultiByteStr...原创 2018-08-06 12:33:52 · 305 阅读 · 0 评论 -
GetLastError错误码大全
GetLastError的返回值的含义:(0)-操作成功完成。(1)-功能错误。(2)- 系统找不到指定的文件。(3)-系统找不到指定的路径。(4)-系统无法打开文件。(5)-拒绝访问。(6)-句柄无 效。(7)-存储控制块被损坏。(8)-存储空间不足,无法处理此命令。(9)-存储控制块地址无效。(10)-环境错 误。(11)-试图加载格式错误的程序。(12)-访问码无效...原创 2018-08-06 12:35:53 · 3056 阅读 · 0 评论 -
CreateThread与_beginthreadex的本质区别
CreateThread函数原型:HANDLEWINAPICreateThread( LPSECURITY_ATTRIBUTESlpThreadAttributes, SIZE_TdwStackSize, LPTHREAD_START_ROUTINElpStartAddress, LPVOIDlpParameter, DWORDdwCreationFl...原创 2018-08-06 12:38:22 · 173 阅读 · 0 评论 -
一个经典的多线程同步问题01 问题重现
程序描述:主线程启动10个子线程并将表示子线程序号的变量地址作为参数传递给子线程。子线程接收参数 -> sleep(50) -> 全局变量++ -> sleep(50) -> 输出参数和全局变量。要求:1.子线程输出的线程序号不能重复。2.全局变量的输出必须递增。下面画了个简单的示意图:分析下这个问题的考察点,主要考察点有二个:1.主线程创建...原创 2018-08-06 12:39:41 · 195 阅读 · 0 评论 -
一个经典的多线程同步问题02 关键段CS
CRITICAL_SECTION一共就四个函数://定义关键段变量后必须先初始化void InitializeCriticalSection(LPCRITICAL_SECTIONlpCriticalSection); //进入关键区域void EnterCriticalSection(LPCRITICAL_SECTIONlpCriticalSection);//离开关关键区域voi...原创 2018-08-06 12:40:59 · 153 阅读 · 0 评论 -
一个经典的多线程同步问题03 事件Event
//创建事件HANDLECreateEvent( LPSECURITY_ATTRIBUTESlpEventAttributes, BOOLbManualReset, BOOLbInitialState, LPCTSTRlpName );函数说明:第一个参数表示安全控制,一般直接传入NULL。第二个参数确定事件是手动置位还是自动置位,传入TRUE表示手动...原创 2018-08-06 12:44:20 · 234 阅读 · 0 评论 -
调用ShellExecute给定参数调用exe或bat
函数原型:HINSTANCE ShellExecute( _In_opt_ HWND hwnd,//父窗口句柄或出错时显示错误父窗口的句柄,可以为 NULL _In_opt_ LPCTSTR lpOperation,//操作 _In_ LPCTSTR lpFile,//要打开的文件名、执行的程序名、浏览的文件夹等。 _In_opt_ LPCTSTR lpPara...原创 2018-11-08 08:22:15 · 1787 阅读 · 0 评论