
S1: Win API
涛歌依旧
毕业后就职于华为和腾讯
展开
-
Windows SDK API是个啥意思?
这是一篇闲扯的文章,我始终坚信:Everything should be made as simple as possible. 下面来看看什么是Windows SDK API. SDK(sotfware development kit), API(application programming interface) 还是画图说吧:原创 2013-05-18 13:42:05 · 8381 阅读 · 0 评论 -
几个简单程序加深你对多线程和信号量的理解
#include #include HANDLE g_hSemp1 = NULL;HANDLE g_hSemp2 = NULL;DWORD WINAPI ThreadProc(LPVOID pVoid);int main(){ cout << "main thread" << endl; g_hSemp1 = CreateSemaphore(NULL,原创 2013-10-06 22:58:03 · 8654 阅读 · 5 评论 -
用多线程模式来做作业和洗衣服(有史以来最通俗最简单的多线程例子,不多说也不解释)
#include #include #include DWORD WINAPI DoHomeWork(LPVOID p){ int i, j, sum = 0; for(i = 0; i < 30000; i++) { for(j = 0; j < 30000; j++) { sum++; // 模拟人做作业的过程,需要耗费人(cpu)的时间原创 2013-10-06 23:45:35 · 8627 阅读 · 3 评论 -
如何用C语言获取系统的用户登录名?
当然啦,你可以在cmd中用whoami命令查到系统的登录名,但如果程序中要用到系统的登录名,那该如何获取呢?Windows API就是强大,如下:#include #include #define MAX_NAME 256int main(){ char szUserName[MAX_NAME] = {0}; unsigned long dwNameLen = si原创 2013-10-20 19:56:59 · 13052 阅读 · 0 评论 -
如何用C语言获取系统的sid信息?
在Win7中,你可以在cmd中输入whoami/user来轻松获取sid信息,但是,要在程序中获得,该怎么做呢?如下(Windows API, 我服了你):#include #include #define MAX_NAME 256void ConvertSid(PSID pSid, LPTSTR TextualSid){ PSID_IDENTIFIER_AUTHORI原创 2013-10-20 21:22:57 · 12215 阅读 · 6 评论 -
如何确保一个函数的被调用次数不少于另外一个函数的被调用次数?
这是个有趣的问题,直接上代码:#include #include HANDLE g_h1 = NULL;HANDLE g_h2 = NULL;int g_m = 0;int g_n = 0;void init(){ g_h1 = CreateSemaphore(NULL, 1, 1, NULL); g_h2 = CreateSemaphore(N原创 2013-11-12 23:51:47 · 7700 阅读 · 2 评论 -
线程句柄作WaitForSingleObject的参数是什么意思?
#include #include DWORD WINAPI Fun1Proc(LPVOID lpParameter);int main(){ HANDLE hThread1; hThread1 = CreateThread(NULL, 0, Fun1Proc, NULL, 0, NULL); WaitForSingleObject(hThread1, IN原创 2014-01-06 23:24:04 · 9995 阅读 · 8 评论 -
CreateProcess的用法
看个简单程序吧:原创 2014-04-12 21:45:14 · 8281 阅读 · 1 评论 -
如何向线程函数传递多个参数?
我们先来看一个简单的程序:#include #include DWORD WINAPI ThreadFun(LPVOID pM){ printf("%s\n", pM); return 0;}int main(){ printf("main thread\n"); HANDLE handle = CreateThread(NULL, 0, ThreadFun, "hel原创 2014-04-13 21:46:38 · 33951 阅读 · 21 评论 -
如何让程序只有一个实例运行(用tftp时的感想)?
最近想搭建一个tftp原创 2014-08-10 23:36:18 · 7981 阅读 · 0 评论 -
Windows环境下利用“共享内存”实现进程间通信的C/C++代码---利用CreateFileMapping和MapViewOfFile
进程间的通信方式有很多种, 上次我们说了最傻瓜的“共享文件”的方法。原创 2014-09-25 21:47:17 · 35338 阅读 · 18 评论 -
如何获取当前运行的.exe所在路径的双斜线形式?---利用GetModuleFileName
先来看一个简单的程序:#include #include using namespace std;int main(){ char szBuf[1025] = {0}; GetModuleFileName(NULL, szBuf, sizeof(szBuf)); cout << szBuf << endl; // C:\Documents and Settings\A原创 2014-11-28 23:42:11 · 8582 阅读 · 0 评论 -
从公司回来忘带手机没有闹铃明早起来不了该怎么办?--- 花5分钟用ShellExecute写个闹铃即可!
从公司回来, 忘记带手机, 又没有闹铃, 明天起来不了, 咋办? 回公司去取手机? 不想去。 在楼下买个闹钟? 觉得没必要。 好吧, 写个简单的C语言程序, 在睡觉的时候把它跑起来即可, 我刚验证了一下, 没啥问题#include int main(){ int i = 0; for(i = 0; i < 60 * 7; i++) // 7小时, 睡7个小时足够啦! { Sle原创 2014-12-03 22:14:32 · 8306 阅读 · 2 评论 -
如何利用多线程写一个简单的定时器?
先来看一个简单的程序, 实现一个定时器来定时调用test函数:#include #include using namespace std;void test(){ cout << "test" << endl;}DWORD WINAPI ThreadFun(LPVOID pM){ int timeVal = *(int *)pM; int start = 0; whi原创 2014-12-26 00:28:11 · 9625 阅读 · 0 评论 -
如何在程序中打开.mp3, .exe, .chm文件? ---介绍一下ShellExecute的用途
下面, 我们看看ShellExecute的重要用途, 用它来打开.mp3, .exe, .chm, 当然啦, 在当前工程中必须有这些文件。#include int main(){ ShellExecute(0, 0, "beauty_voice.mp3", 0, 0, 0); return 0;} 上面程序会唱歌。#include int main(){原创 2014-12-26 22:59:04 · 8326 阅读 · 0 评论 -
下面程序为什么没有一直陷入main的while(1)循环?(多线程在作怪)
很久以前,接触一个项目,看到一个while(1)死循环,但又发现程序经常跳出while去执行另外一段程序,甚为疑虑。其实,在多线程模式下,这是可能的,下面的程序就不会一直陷入main的while(1)循环:#include #include DWORD WINAPI ThreadFun(LPVOID pM){ while(1) { printf("thread\n原创 2013-10-06 21:52:34 · 11389 阅读 · 4 评论 -
为什么要使用多线程?(无代码,无真相)
如果你熟悉VC++6.0或者BCB6.0, 你可以做这样一个实验:在按钮对应的方法中,让程序睡眠10秒钟,在这10秒钟之内,你无法移动窗体,也无法改变窗体大小,因为你用的是单线程呗。 书上,网上有不少地方在说多线程好,多线程有效率,有时候,你会发现一头雾水,下面,我来模拟用户界面线程和后台线程,旨在说明多线程为什么高效,程序如下:#include #include #i原创 2013-10-05 23:32:04 · 9896 阅读 · 7 评论 -
Windows应用程序的封装
在本文中,我们将讨论Windows应用程序的封装,此处的封装是用函数来封装函数,而不是用类来封装函数(MFC是这样做的)。那么,我们为什么要用函数来封装函数呢?因为这对理解MFC有很大好处。 先看没有封装的程序:#include // 回调函数LRESULT CALLBACK MyFun( HWND hwnd, UINT uMsg, WPARAM wParam,原创 2013-05-26 19:19:59 · 9005 阅读 · 0 评论 -
DOS应用程序,Windows Console 应用程序,Windows应用程序有什么区别?
DOS应用程序: 往事,真的不想回首,开始学C语言的时候,学校用的是TC, 都什么年代了,还用TC, 真想问问决定用TC的那个老师,为什么要用TC, 不用VC++编译器。学生刚开始学C语言,你说,用TC方便还是VC++方便?明显是在为难初学者,不提了。想了解什么是DOS应用程序,那个用TC写的就是DOS应用程序。当然啦,DOS应用程序是无法调用Windows的API的。原创 2013-05-25 14:34:14 · 9979 阅读 · 0 评论 -
什么是回调函数?
回调函数,简单来说,就是当某一事件发生,触发某一函数的执行,那么,这个函数可以看作回调函数。 我们知道,在Windows应用程序中,程序的入口是WinMain,为什么是WinMain呢?因为WinMain可以看作Windows定义的一个接口,Windows对写应用程序的程序员说:你在WinMain函数中写程序,一点击“运行”按钮(注意这个事件),WinMain函数就会被Windo原创 2013-05-24 21:58:24 · 8806 阅读 · 1 评论 -
如何利用C++ Builder获取系统的sid信息?
头文件代码://---------------------------------------------------------------------------#ifndef Unit1H#define Unit1H//---------------------------------------------------------------------------原创 2013-10-20 23:41:32 · 9129 阅读 · 1 评论 -
深入详解Windows消息机制(2012年某公司实习生招聘面试试题)
我们首先来看看用户是如何和应用软件打交道的,如图: 上图就是用户与应用软件交互的一个逻辑图,我们在用Word等软件时,就是这种模型。从用户的感觉来看,用户是在与应用软件对应的窗口打交道,用户感觉离应用软件很近很近。真的很近么?非也!虽然用户在逻辑上离应用软件的确很近,但在物理上,用户离应用软件却是相对较远的。下面,我们来看看,用户究竟是如何与应用软件打交道的(用户不需要知原创 2013-05-25 12:09:41 · 11429 阅读 · 0 评论 -
一个最简单的Windows应用程序
下面是一个最简单的Windows应用程序:#include int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd ){ MessageBox(0,"该吃饭啦!", "温馨提示:", 0); return 0;}原创 2013-05-18 12:33:23 · 8014 阅读 · 0 评论 -
如何在Windows Application中应用printf函数?
下面,我们先看一个最简单的Windows应用程序:#include int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd ){ MessageBox(0, "调用了WinMain函数", "测试:", 0); re原创 2013-05-22 18:06:12 · 11753 阅读 · 2 评论 -
C,C++,VC, VC++,MFC有什么区别?
概念是对具体的一种抽象,因此,弄懂概念很重要,很多人总是混淆下面这些概念:C,C++,VC,VC++,MFC. 下面,我们来看看这些概念有什么区别: C: 一门计算机语言,用于人与计算机沟通。 C++: 一门计算机语言,用于人与计算机沟通,比C更强大。 VC和VC++可以看成一个原创 2013-05-25 13:49:04 · 17453 阅读 · 4 评论 -
多线程入门(Time to step into multi-threading)
先说明一下CreateThread函数的参数dwCreationFlags, 当它为0的时候,表示线程创建后可以立即进行调度,而不是说线程对应的函数立即执行。你看网上的几乎所有资料,你看msdn, 那都会误导你,至少在这个问题上是这样的。 先上一段小代码:#include #include DWORD WINAPI ThreadFun(LPVOID pM)原创 2013-10-03 15:18:00 · 8339 阅读 · 1 评论 -
线程同步之互斥对象(通俗易懂)
先看售票系统的程序,看看多线程容易出什么问题:#include #include DWORD WINAPI Fun1Proc(LPVOID lpParameter);DWORD WINAPI Fun2Proc(LPVOID lpParameter);int index = 0;int tickets = 100;int main(){ HAND原创 2013-10-03 16:56:46 · 12412 阅读 · 10 评论 -
线程同步之事件对象(类比互斥对象进行分析)
#include #include DWORD WINAPI Fun1Proc(LPVOID lpParameter);DWORD WINAPI Fun2Proc(LPVOID lpParameter);int tickets = 100;HANDLE g_hEvent; // 事件对象int main(){ HANDLE hThread1; HAN原创 2013-10-03 22:00:30 · 7903 阅读 · 8 评论 -
线程同步之临界区(类比互斥对象进行分析)
先来复习两个简单的英语单词吧: critical : 临界的;关键的 section: 区域;区段会拉屎的人,一定会利用临界区来实现线程同步。下面,我将介绍利用临界区来实现线程同步。什么是临界区呢?临界区好比一个厕所的槽位,有人在里面,你就不能进入。我发现,每天早上八九点种的时候,厕所的每一个槽位基本都是满的,想拉屎,总是要原创 2013-10-03 23:09:07 · 7825 阅读 · 6 评论 -
线程同步之信号量(“旗帜“就是方向,“旗帜“就是形象, “旗帜“就是指挥棒)
待完成原创 2013-10-03 23:18:56 · 7975 阅读 · 7 评论 -
线程死锁(由哲学家就餐到售票系统)
都说哲学家最聪明,确实如此,但有时候,哲学家又是最傻的,傻傻地等待,傻傻地思考,殊不知,已经陷入死锁状态,坐等饿死。 下面还是以售票系统为例来说明死锁,直接上代码:#include #include DWORD WINAPI Fun1Proc(LPVOID lpParameter);DWORD WINAPI Fun2Proc(LPVOID lpParameter原创 2013-10-04 00:00:41 · 7935 阅读 · 6 评论 -
SetTimer设置后没法调用定时器函数(回调函数)吗?
我们先来看一个简单的程序:#include <iostream>#include <windows.h>using namespace std;void myTimerProc(HWND hwnd, UINT uMsg, UINT_PTR idEvent, DWORD dwTime ){ cout << "hello" <<...原创 2014-12-25 23:50:53 · 11899 阅读 · 2 评论