WIN32
最爱吹吹风
觉悟
展开
-
Windows 异常处理
windows 上的异常处理原创 2022-04-29 16:00:06 · 1742 阅读 · 0 评论 -
PDB 符号文件去除私有符号
PDB 符号文件去除私有化符号,方便给三方调试,又可以有效防止代码被逆向。微软的给用户提供的sdk库符号文件也经过去除私有化的处理,有效的保护了代码信息原创 2022-04-24 20:22:27 · 583 阅读 · 0 评论 -
Timer 定时器
Windows 上原生Timer常用的有下面两个:1. SetTimer windows上最简单方便的定时器,不足之处是要依赖消息循环,不能在工作线程使用。时钟到了会将WM_TIMER放入消息队列,也会收到消息队列中消息数量和消息处理过程影响2.SetWaitableTimer 内核定时器,可以在任何线程使用。精度也较SetTimer高,不过对不同系统这个默认精度不同,可以通过timeBeginPeriod设置,这个在msdn SetWaitableTimer 的介绍中也有提到:SetWaitab.原创 2022-03-24 18:16:32 · 677 阅读 · 0 评论 -
Windows Dpi 缩放
windows dpi 缩放原创 2022-01-08 16:38:28 · 1912 阅读 · 0 评论 -
Windows网络状态判断
项目中应用的长连底层是通过socket建立连接的,但是socket并不能及时的感知当前网络的状态,比如网络断开,在iOS上socket并不能立即感知,需要通过心跳等手段来当前是否断开。这一点在Win10上没有,Win10上如果断开网线或者wifi socket都能及时抛出错误,但是网络重新连接成功后并不能及时识别,这就造成了再windows上网络连接之后底层socket连接不能及时去重新建立,这就需要通过上层来通知底层进行重建。有两种方式可以获取windows上网络连接信息:主动获取。通过INetw原创 2021-03-15 14:09:33 · 2008 阅读 · 0 评论 -
Windows网络连接状态获取
是否有网络连接:INetworkListManager::get_IsConnected是否有可用的网络连接:INetworkListManager::get_IsConnectedToInternet附上一篇相关的文章:https://docs.microsoft.com/zh-cn/previous-versions/windows/desktop/mpc/network-...原创 2020-02-07 16:30:50 · 1529 阅读 · 0 评论 -
字符编码Unicode UTF-8 GBK的不同和转换
http://www.cnblogs.com/gavin-num1/p/5170247.html转载 2017-11-04 16:19:32 · 278 阅读 · 0 评论 -
分享两篇关于HRESULT的文章
http://blog.csdn.net/xdrt81y/article/details/11642919http://blog.csdn.net/wangqiulin123456/article/details/8145811最近是遇到了一个问题,是在写log的时候无法打印出HRESULT的值,甚至会崩溃。HRESULT hr = 10;printf("%l", hr转载 2017-08-04 09:39:52 · 659 阅读 · 0 评论 -
GDI+播放GIF动图
TCHAR szModule[MAX_PATH] = {0}; GetModuleFileName(NULL,szModule,MAX_PATH); PathRemoveFileSpec(szModule); PathAppend(szModule,L"success.gif"); Image img(szModule); UINT nCount = img.GetFrameDimens原创 2015-05-05 13:57:41 · 3341 阅读 · 0 评论 -
VS2015项目属性配置中的变量设置
关于VS的项目属性配置,很长时间都没有去细究关于各种定义的意义。比如说$outDir这样的东西以前没有细细追究过原因,这次都一并做个记录。1. 常规页签 。是对各个变量的解释输出目录($OutDir), 中间目录($IntDir), 目标文件名($TargetName),目标文件扩展名($TargetExt)。设置好之后方便其他设定时可以直接引用。 2.编译页签(C/C+...原创 2016-04-28 14:26:24 · 16109 阅读 · 1 评论 -
静态库和动态库
静态库(.lib)中相当于存放了所有的源代码, 包括他引入的其他静态lib文件.(其实是所有CPP编译后对应的.obj文件的打包)。所以静态lib都比较大。 动态库dll也有lib但是这个lib, 只是用来帮助程序在链接时定位DLL中的函数的地址的。所以会在EXE加载时才重定位函数的地址。重定位就是根据链接的这个lib的函数地址进行偏移计算后得到的。另外在静态库的链接过程中,原创 2016-04-14 18:36:03 · 430 阅读 · 0 评论 -
windows服务程序中创建用户进程
最近碰到个问题, 需要在服务中检测用户桌面的情况。但是服务程序都是SYSTEM账户下运行, 属于Session0, 不能检测到用户桌面的情况。所以就需要另启一个用户进程来获取这些信息, 然后发送给服务。所以就用到了 CreateProcessAsUser来创建用户进程。#include #include #include #include #include #pragma com原创 2015-11-30 17:11:56 · 2848 阅读 · 3 评论 -
枚举桌面窗口并获取进程信息
#include #include #include #pragma comment(lib, "psapi.lib")using namespace std;BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam){ if (GetParent(hwnd) == NULL && IsWindowVisible(hwnd))原创 2015-11-17 17:00:13 · 2051 阅读 · 0 评论 -
会话(session)、工作站(WindowStation)、桌面(Desktop)、窗口(window)
一个系统可以同时登录多个用户(包括远程用户登录) 一个用户拥有一个会话(远程用户被称为远程会话) 一个会话拥有多个工作站和窗口。只能拥有一个交互式工作站(Winsta0)。 一个会话拥有一系列私有的进程和模块:Csrss.exe、WinLogin.exe、win32k.sys 一个会话拥有一个私有对象名字空间(\BaseNamedObjects),私有对象名转载 2015-10-29 16:00:23 · 2746 阅读 · 0 评论 -
目录文件监控
// 监视文件夹中文件变化.cpp : Defines the entry point for the console application.//#include "stdafx.h"#include #include #include using namespace std;int _tmain(int argc, _TCHAR* argv[]){ //监控主文件夹变化转载 2015-10-14 10:44:22 · 823 阅读 · 0 评论 -
强大的宏定义(macro)
事件分发:(global.h)#pragma once#include #include #include #include #include class IExtension{public: virtual ~IExtension() {};};namespace{ auto f = [](GUID guid1, GUID guid2) { if (gu原创 2018-01-30 21:12:40 · 923 阅读 · 0 评论 -
Windows异常处理
对异常处理的研究不够多,这个也源于工作中项目框架一般比较完善的原因,总结一下Windows下C++开发中常用的异常处理方式:1. 语言自带异常逻辑 try catch,这个应该是最熟悉的了。C++支持的方式,跨平台。不足的地方在于只能捕获语言的异常,就是有有刻意在逻辑中throw出来的。2. Windows提供的异常,问题就是不能跨平台,但是功能强大。__try __except, 能够捕获Win...原创 2018-06-07 10:33:22 · 545 阅读 · 0 评论 -
全局/静态变量跨模块(DLL)引用
全局/静态变量作用范围为整个模块(exe\dll),如果其他模块需要引用必须显示导出,类内部的静态变量一样,只是引用范围需要加上类的作用域,这个从类中声名静态变量,但是要在CPP中定义该变量可以看出,跟全局变量是一样的。如果在其他模块中引用类中的静态变量必须加入dllimport导入,否则链接提示找不到该符号。 唯有函数内部的局部静态变量不同,导出该函数的同时,或者传入该函数...原创 2018-10-08 18:23:37 · 4151 阅读 · 0 评论 -
客户端卡死和系统卡慢(Windows线程调度)
Windows客户端中有时候会出现界面操作卡死,卡慢的问题,大多数情况是因为当前进程的主线程,即UI线程太繁忙,不能及时响应用户的操作。这种情况下,需要定位繁忙的逻辑所在,给主线程减压。给主线程减压的方法可以增加工作线程,将繁忙的任务抛给工作线程来做,结果交给主线程去做刷新。最近在做IM,遇到一个情况,网络上抛过来的消息量太大,可能一秒钟就有上千条数据,主线程根本来不及绘制,即便主线程只是绘制,这...原创 2019-07-27 16:00:12 · 1070 阅读 · 0 评论 -
VS调试dump
用过VS调试dump的人,都知道UI界面用起来很方便。第一先设置符号和二进制的路径,设置好之后就可以点击使用 仅限本机调试进行调试了,一般来说只要上面两个路径设置好,堆栈会立即显示出来。如果这个时候堆栈还没有显示全。类似下面这样:> Qt5Widgets.dll!5d2a6c00() 未知 非用户代码。无法查找或打开 PDB 文件。 [下面的框架可能不正确和/或缺失...原创 2019-06-17 17:28:29 · 1688 阅读 · 0 评论 -
Windows中的用户权限和session限制(创建工作在不同用户权限和Session下的进程)
Windows中的进程都会绑定一个token(权限令牌),这个token记录了该进程的权限,不同的用户有不同的权限,所以不同用户下启动的进程时绑定的token是不同的,可以修改这个token,让进程开启或禁用已经拥有的权限(SetTokenInformation)。注意不是增加,是修改,因为token是用户的权限策略,如果该用户没有这个权限,那么在他启动的进程中是不可能增加这个权限的。Win7...原创 2019-05-28 15:42:41 · 3147 阅读 · 0 评论 -
一个简单的Windows服务程序
#include <iostream>#include <Windows.h>#include <fstream>#include <thread>std::ofstream ofile("D:\\runapp.txt");WCHAR service_Name[] = L"runapp";SERVICE_STATUS ServiceS...原创 2019-05-27 19:28:35 · 411 阅读 · 0 评论 -
Windows客户端异常收集-BugReport
说起bugreport.exe这个东西,大家应该都不陌生,有时候QQ崩溃或者其他应用崩溃都会看到这个进程在后台启动。其实他就是在主进程崩溃后启动的异常收集程序。他所做的事情大致如下:读取dmp文件,并上传后台,一般会同时上报当前应用版本,崩溃时间,dmp文件md5,等附加信息,方便后台进行管理。dmp文件一般由应用程序在捕获到异常时自己写入。 很多bugreport也包含了错误日志上报的功能...原创 2019-04-19 17:26:47 · 1823 阅读 · 0 评论 -
Unicode字符集和编码
因为要接入emoji,所以对最近又参考了一些编码方面的东西。整理一下,发现编码方面的东西还真多。1.ANSI是Windows独有的,根据操作系统区域会实际对应不同的编码:中国-GBK,美国-ASCII,其他的各有对应。2.Unicode字符集的编码。utf-8变长,1~4字节。utf-16变长2或4个字节,虽然叫16,实际还是在2字节和4字节之间,但是没有3个字节。utf-32固定4个字节...原创 2019-03-27 10:31:47 · 301 阅读 · 0 评论 -
Windows进程生命中的几个点
先映射Dll,之后映射EXE 创建主线程执行DLL的DllMainCRTStartup初始化dll中的全局变量,传入DLL_PROCESS_ATTACH。之后执行EXE的MainCRTStartup,初始化exe中的全局变量,然后执行main函数。 程序执行完,main函数返回之后,到MainCRTStartup清理全局变量,之后调用ExitProcess。ExitProcess调用DllMa...原创 2018-12-22 22:31:55 · 191 阅读 · 0 评论 -
debug和release版本dll混用导致的问题
最近在调试程序的时候有一个现成的模块为了方便直接copy了一个release版本的dll过来。在调试的时候发现了一个指针访问的问题。在执行一个dll中的函数的时候导致了这个问题。估计是debug版本和release版本dll的函数地址不同, 单是从lib到定位到dll对象或者函数地址位置的原理是什么, 这还是个问题。...原创 2015-11-22 17:37:23 · 6692 阅读 · 1 评论 -
windows窗口透明
http://www.qingfengju.com/article.asp?id=199转载 2015-09-07 10:56:35 · 616 阅读 · 0 评论 -
Windows服务(Windows Service,system权限)程序显示界面与用户交互(xp,win7通用)
引自: http://blog.csdn.net/stony1980/article/details/7886624转载 2015-09-01 15:18:45 · 721 阅读 · 0 评论 -
windows服务程序
有时候需要windows服务程序来执行一些操作, 比如需要在登陆前启动, 不想被杀软判为自启动, 当然还是能被发现, 但是杀软的普通清理时不会清理的。但是服务程序不能进行界面交互, 因为他不属于用户界面。他只是在后台默默的启动, 运行, 对于收集数据, 后台更新再合适不过了。 一个服务程序的简单写法:SERVICE_STATUS_HANDLE hServiceStatus;SERVICE_S原创 2015-08-31 11:06:59 · 524 阅读 · 0 评论 -
创建windows计划任务
#include int _tmain(int argc, _TCHAR* argv[]){ if (0 == system("schtasks /create /tn \"show disk space\" /tr E:\\APLATFORM\\Testing\\Console\\Debug\\GetDisk.exe /sc onstart")) { printf("sucess"原创 2015-03-30 23:10:45 · 706 阅读 · 0 评论 -
通过域名获取ip地址
#include #include #include #pragma comment(lib,"WS2_32.lib")int _tmain(int argc, _TCHAR* argv[]){ int ret = 0; WSADATA wsaData; ret = WSAStartup(MAKEWORD(2, 2), &wsaData); if (ret != 0) {原创 2015-03-30 23:01:57 · 532 阅读 · 0 评论 -
windows启动进程的步骤
首先分析一下,windows启动一个进程的过程。进程启动有两种方式,第一种就是经常用的鼠标双击一个应用程序,就为这个程序启动了一个进程。 第二种是通过CreateProcess,或者是ShellExecute,ShellExecuteEx来启动。 这两种方式除了看来不一样,其实后台的工作都是一样的。先是创建一个进程对象,为进程申请内存,然后把EXE文件映射到这片内存中。创建一个主线程,原创 2015-02-03 17:31:37 · 1451 阅读 · 0 评论 -
关于windows线程
windows为 每个线程维护一个消息队列,在这个线程中通过getmessage来获得线程消息队列中的消息。然后通过dispatchmessage把消息送给窗口函数。单谈dispatchmessage是非常智能的,能根据窗口绑定的窗口函数去找该调用哪个窗口函数。在创建窗口前就已经注册了窗口函数了,所以dispatch找的到时哪个窗口函数。 一个普通的工作线程也是有消息队列的,只是没有Ge原创 2013-07-23 10:48:04 · 745 阅读 · 0 评论 -
与路径处理相关的WIN32 API
1.PathFileExists 判断路径是否存在2.原创 2014-11-03 14:18:43 · 1346 阅读 · 0 评论 -
关于TCP最大连接数的问题
关于服务端TCP连接数的问题,在网上很多都是错误的答案,我这里要澄清一下这个问题,因为我也被很多网上的答案误导。TCP服务端的连接数于端口个数无关,这个网上的误导答案很多。 TCP服务端,需要的只是一个监听端口,无论多少客户端连接上来,始终都是这个端口对外。服务端accept返回的socket只是通过客户端的ip跟端口来区分TCP连接的。 所有客户端的数据都是通过那个原创 2014-11-30 11:12:59 · 1663 阅读 · 0 评论 -
SHUnicodeToAnsi SHAnsiToUnicode
这两个shell api用于unicode和ansi之间的转化非常方便用法 : wchar_t* p =L"ddx";char buf[10] = {0};SHUnicodeToAnsi(p,buf,10);但是微软官方说有可能取消这两个API,win7上是可以用的,不知道Win8可用否。不过这个实在比MultiByteToWideChar方便了太原创 2013-12-11 17:03:26 · 1759 阅读 · 0 评论 -
SHFileOperation操作文件
用SHFileOperation来操作文件时非常方便,比用其他的MoveFile,CopyFile之类的API要统一很多,但是在填写路径时要特别注意 char* From = "E:\\PS.txt\\\0"; \\字符串的结尾一定是需要\\\0这样一个串,否则操作会失败,微软的 文档上面说是这个参数是可以写入多个路径的原创 2013-12-10 17:27:00 · 871 阅读 · 0 评论 -
SHGetKnownFolderIDList
此shell api用于获取特殊位置文件夹的路径,比如桌面,common,我的文档等等。与此相似的有SHGetSpecialFolderLocation,SHGetFolderLocation,但是微软已经不建议使用这两个shell api了,他们的存在只是为了兼容vista之前的系统。SHGetKnownFolderIDList 的用法:ITEMIDLIST* pID原创 2013-12-11 11:28:28 · 1880 阅读 · 0 评论 -
SHGetFileInfo
SHGetFileInfo用于获取文件,文件夹,或者磁盘的信息用法: SHFILEINFO info = {0}; SHGetFileInfo("D:\\book",0,&info,sizeof(info),SHGFI_TYPENAME|SHGFI_DISPLAYNAME|SHGFI_ICON); SHGFI_TYPENAME 获取类型信息,比如 文件夹 S原创 2013-12-11 15:24:53 · 1585 阅读 · 0 评论 -
Shell_NotifyIcon
这个shell api是给桌面右下角的任务状态栏发消息的,一般给程序添加托盘就是用这个函数来做。用法: 1.添加托盘图标 NOTIFYICONDATA ndata = {0};ndata.cbSize = sizeof(ndata);ndata.hIcon = m_hIcon; //要添加的图标ndata.uFlags = NIF_MESSAGE|NIF_原创 2013-12-11 14:36:18 · 2105 阅读 · 0 评论