
Windows应用层编程技术
文章平均质量分 55
Windows应用层编程技术,长期更新
宇龍_
有些白嫖党连个赞都不点甚至直接抄走了说原创,新发布的都写到专栏里吧,哎。
私聊给群号,可进Q群咨询问题。
展开
-
Windows各版本符号表离线下载
Windows各版本符号表离线下载转载 2022-08-28 02:30:00 · 2972 阅读 · 0 评论 -
Com多进程通信实现
Com多进程通信实现;Com连接点无法生成代码的解决方案;代理组件XXXPS.dll无法编译通过;原创 2022-07-31 22:40:19 · 1095 阅读 · 7 评论 -
Windows线程池使用方法
Windows线程池原创 2022-07-30 18:20:44 · 850 阅读 · 0 评论 -
创建自签名证书, 对exe文件进行数字签名
创建自签名证书,对exe文件进行数字签名原创 2022-07-23 15:09:23 · 8076 阅读 · 1 评论 -
WinVerifyTrust调用返回80096005错误,时间戳签名或证书无法验证或已损坏
WinVerifyTrust;80096005;时间戳签名或证书无法验证或已损坏原创 2022-07-23 11:49:06 · 2303 阅读 · 0 评论 -
通过ATL库CRegKey读、写、遍历注册表(简单方便)
CRegKey读、写、遍历注册表原创 2022-07-18 22:16:03 · 667 阅读 · 0 评论 -
win32创建窗口及按钮(轻量级)
win32,窗口,按钮原创 2022-06-30 22:42:48 · 2798 阅读 · 0 评论 -
互斥对象与临界区的区别
互斥对象,临界区,Windows原创 2022-06-14 23:16:32 · 197 阅读 · 0 评论 -
Windows编程——读写锁
读写锁,线程同步,Windows原创 2022-06-13 23:18:25 · 1661 阅读 · 2 评论 -
软件安装信息、系统服务在注册表中的位置
软件安装信息、注册表原创 2022-06-11 16:11:30 · 5521 阅读 · 0 评论 -
CString在多线程中的问题
闲来没事,聊聊CString在多线程中很容易踩的坑,这个坑很可能存在于你现在的项目中。举例:int main(){ CString str = L"test"; CString strThread1 = str; CString strThread2 = str; //将两个参数传递到各自的线程中,以下使用伪代码 CThread thread1(strThread1); CThread thread2(strThread2); thread1.wait();原创 2022-05-17 22:28:46 · 608 阅读 · 11 评论 -
通过进程PID获取可执行文件全路径,提取路径中的文件名,提取文件名后缀、提取全路径中的目录、枚举进程加载模块dll
需要用到如下API32位的程序调用此API同样能获取到64位进程的可执行文件路径。下面是微软在文档中的说明,由于该API很简单就不再复述了hProcess [in]A handle to the process. This handle must be created with the PROCESS_QUERY_INFORMATION or PROCESS_QUERY_LIMITED_INFORMATION access right. For more information, see Proces原创 2022-05-08 16:04:32 · 2105 阅读 · 0 评论 -
VC下Unicode和ANSI互转,CStringW和std::string互转
前言众所周知,CString有两种,分别是使用ANSI编码的CStringA和使用Unicode编码的CStringW,其中CStringA和std::string的转化非常简单,毕竟都是使用的ANSI编码,这里就不谈了,只谈CStringW和std::string的转化。正文微软有提供宽窄字节转换的API函数,但稍显麻烦了一些,这里使用的是微软在ATL中提供的几个宏,使用非常的简单。常用的有如下转换宏:1、W2A和A2W2、CW2A和CA2W一、W2A和A2W的使用方法原创 2022-05-07 22:53:29 · 1152 阅读 · 0 评论 -
CString的GetBuffer和ReleaseBuffer使用说明
先看一段代码:#include <atlstr.h>//测试CStringint main(int argc, _TCHAR* argv[]){ CStringA strTemp = "555"; //这里输出为3,不包含结束符 printf("str=%s,len=%d\n",strTemp.GetBuffer(),strTemp.GetLength()); LPSTR lpStr = strTemp.GetBuffer(10); //这里输出为3,因为对GetBu原创 2022-05-06 22:34:32 · 784 阅读 · 0 评论 -
一种插件式的Windows程序设计原理
前言在这里分享一种方法,一种非常巧妙的插件式Windows程序设计方法基本原理这种插件式的Windows程序设计方法,即一个进程多个DLL,理论上可以无限扩张。程序中的每个功能模块都是一个单独的DLL,每个DLL之间又可以相互进行通信,DLL A可以发送消息到其他任意一个DLL中,也可以接收其他任意的DLL发送来的消息,而且要求收发消息采用通用接口,接口能支持同步和异步两种模式。DLL之间还能支持单播、多播、广播,也就是说DLL A可以通过发送一次消息,来实现同时调用其他任意个数的D原创 2022-04-23 13:32:17 · 1632 阅读 · 0 评论 -
Windows编程之事件对象(2)
在Windows编程之事件对象(1)的基础之上再实现一个例子:两个进程交替打印0和1,这里用到了另个一APIHANDLE WINAPI OpenEvent( __in DWORD dwDesiredAccess, __in BOOL bInheritHandle, __in LPCTSTR lpName);参数dwDesiredAccess [in]对事件对象的访问标志。如果指定对象的安全描述符不允许调用进程请求访问,则函数失败。bInheritHandle[.原创 2022-04-14 23:36:43 · 393 阅读 · 0 评论 -
编写Windows系统服务(通过ATL实现)支持xp系统
前言C++通过ATL可以很容易的实现Windows系统服务,这里以VS2017为例,其他版本的VS基本上都一样操作。编写TestService1、新建项目新建项目——ATL项目——命名为TestService2、选择应用程序类型为服务.exe3、生成源代码4、修改服务的名称在资源视图下可以修改服务的名称5、实现接口: 实现以下几个接口,以隐藏父类的同名函数(注意这里不是重写...原创 2022-04-14 21:52:48 · 1382 阅读 · 1 评论 -
Windows编程之事件对象(1)
事件对象是Windows的内核对象,常见用途:1、用于线程同步2、用于保证应用程序单实例运行。一、创建事件对象HANDLE CreateEvent( LPSECURITY_ATTRIBUTES lpEventAttributes,// 安全属性 BOOL bManualReset,// 复位方式 BOOL bInitialState,// 初始状态 LPCTSTR lpName // 对象名称);第一个参数 lpEventAttributes 为指向安全属...原创 2022-04-14 09:00:00 · 658 阅读 · 0 评论 -
ATL容器——CAtlArray,CAtlList,AtlMap,CRBMap,CRBMultiMap
ATL容器——CAtlArray,CAtlList,AtlMap,CRBMap,CRBMultiMap原创 2022-03-29 21:41:38 · 1141 阅读 · 0 评论 -
COM编程入门1-创建项目并编写接口
以下项目的构建与开发使用的是vs2010,与vs2015、2017区别不大1、创建ATL项目并命名为test12、应用程序类型选择动态链接库3、右键项目属性添加类并选择ATL简单对象,命名为Func4、选择自定义接口5、 按Ctrl+Shift+C 切换到类视图,右键IFunc类并添加方法,先编写一个整数求和的接口Add该接口一共三个参数,[in LONG n1,in LONG n2,out retval LONG* p...原创 2022-03-20 21:49:25 · 1275 阅读 · 0 评论 -
VC++ GetProcAddress 获取函数指针失败的问题
原因:编译成DLL后函数名发生改变,直接通过GetProcAddress是无法获取的用Depends工具(下载地址:http://www.dependencywalker.com/) 打开DLL后可查看导出的函数名称解决方案:有三种方法可以在VC生成的dll中导出原始函数名称:1. 使用.def文件这个方法通用性最好,建议使用。2. 使用#pragma comment(linker, ......)该方法受限于VC的编译器,x86和x64的编译器编译出来的函数名称是不一样的。因此需要原创 2022-02-16 16:30:19 · 2221 阅读 · 0 评论 -
C/C++实现关闭命令行快速编辑模式(Windows系统)
背景:开发了一个程序,需要通过cmd命令行来运行该程序,但在多次使用后发现,有时候程序会卡住,必须要按回车程序才会输出,网上搜索了一番,发现这是由于命令行窗口的快速编辑模式导致的,我希望能在调用我的程序时,该模式就被关掉,而不是让用户手动关闭。方案:在主函数开头加入几行代码即可:HANDLE hStdin = GetStdHandle(STD_INPUT_HANDLE);DWORD mode;GetConsoleMode(hStdin, &mode);mode &=原创 2022-01-12 15:41:05 · 1997 阅读 · 1 评论 -
html+js开发windows桌面程序的方案(miniblink)
最近需要开发windows桌面程序,但由于界面复杂多变且项目周期较短,故放弃完全使用qt或mfc来开发,首先考虑了Electron,但发现其打包的程序实在太大超过了100M,偶然间发现某vpn软件使用到了叫miniblink的库(是一个开源的、单文件、且目前已知的最小的基于chromium的浏览器控件),网上初步了解了一下发现基本满足我的要求:1、可以基于html+js开发桌面程序。2、打包后文件较小,只有15M左右故用到了项目中,暂时没有发现什么问题,值得推荐一波知乎:https://原创 2021-09-01 19:47:45 · 3691 阅读 · 0 评论 -
windows 执行cmd报错、wmi报错,提示无效类
windows 执行cmd报错、wmi报错,提示无效类下载修复工具修复,估计是某些原因导致系统注册的dll、ocx等被卸载了下载地址:https://download.youkuaiyun.com/download/Think88666/15587936原创 2021-03-05 15:21:36 · 2599 阅读 · 0 评论 -
打开文件夹并选中文件,参考这条cmd命令
explorer /select,c:\test\fileName注意,文件的路径必须由\分割,不能是/,否则程序调用没有任何效果!原创 2020-10-29 15:53:36 · 1536 阅读 · 1 评论 -
调用OpenProcess失败解决方案
服务程序,程序的创建者为SYSTEM用户;非SYSTEM用户调用OpenProcess访问该服务程序时,调用失败,GetLastError返回5调用以下函数提权:void enableDebugPriv(){ HANDLE hToken; LUID sedebugnameValue; TOKEN_PRIVILEGES tkp; if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES |原创 2020-08-28 10:39:41 · 3353 阅读 · 1 评论 -
通过SendMessage向一个窗口的子控件发送消息
比如向一个MFC窗口的ActiveX控件发送消息,假设窗口的标题是"abcd",ActiveX控件的标题是"fff"则代码如下: HWND hWnd = ::FindWindow(NULL,"abcd"); if(hWnd) { hWnd = ::FindWindowEx(hWnd,NULL,NULL,L"fff"); if(hWnd) ::SendMessage(hWnd,WM_TEST,0,0); }原创 2020-06-23 16:10:46 · 1006 阅读 · 0 评论 -
wchar_t *和char * 相互转化
转载了一个简答粗暴的方法:std::wstring CharToWchar(const char* c, size_t m_encode = CP_ACP){ std::wstring str; int len = MultiByteToWideChar(m_encode, 0, c, strlen(c), NULL, 0); wchar_t* m_wchar = new wchar_t[len + 1]; MultiByteToWideChar(m_encode, 0, c, strlen原创 2020-06-23 15:44:24 · 1716 阅读 · 0 评论 -
WM_COPYDATA 注意事项
这里转载了一位同学对WM_COPYDATA的总结,写的不错,我基本没有修改。COPYDATASTRUCT有三个成员变量,如下所示:typedef struct tagCOPYDATASTRUCT { ULONG_PTR dwData; DWORD cbData; PVOID lpData;} COPYDATASTRUCT, *PCOPYDATASTRUCT;注意:1、dwData为自定义数据,按照自己习惯设置就好,不影响对象的传输;2、cbDat.转载 2020-06-23 15:40:10 · 886 阅读 · 0 评论 -
无法接收SendMessage消息
窗口向另一个进程的窗口发送消息,但那个窗口始终收不到消息,虽然已经通过FindWindow找到了句柄,最后发现接收消息窗口的进程是管理员权限运行,发送窗口不是,二者均以管理员方式运行后即可正常通信。...原创 2020-06-23 15:19:16 · 2327 阅读 · 0 评论 -
qt中使用SendMessage
调用SendMessage非常简单,同MFC中一样,但在Qt中如何如何接收消息呢?重写winEvent方法即可bool QWidgetB::winEvent( MSG *message, long *result ){ if(message->message == (WM_USER+1000)) { QString *text = (QString*)message->wParam; QString str = *text; ui.textEdit->append原创 2020-06-23 15:17:42 · 2754 阅读 · 0 评论 -
qt中调用windows api需要注意的
在qt中调用windows api除了引入头文件还要引入lib文件比如调用FindWindow,只引入头文件(windows.h)则编译时会报错需要在.h或.cpp文件中加上#pragma comment(lib,"user32")原创 2020-06-22 10:23:26 · 2151 阅读 · 0 评论 -
C++/VC/QT 隐藏调用程序
有时候需要在我们的程序中调用cmd命令行,但尴尬的是会在界面上显示一个黑框。如何隐藏黑框?以qt代码为例:(只需要替换QString即可,可直接传递参数)void CTest::HideRunProcess(QString param){ STARTUPINFO si; PROCESS_INFORMATION pi; si.cb = sizeof(STARTUPINFO); GetStartupInfo(&si); si.wShowWindow =原创 2020-06-11 17:24:49 · 812 阅读 · 0 评论 -
VC/MFC 强制结束当前进程
最近接手一个MFC老项目,Bug太多,主线程退出的时候,也不管子线程死活,直接退出,导致子线程又去访问那些被释放的资源,结果程序无法关闭,或者导致进程在后台驻留了。这里提供一种简单粗暴的方法://强行结束自己void TerminateApp(){ HANDLE hself = GetCurrentProcess(); TerminateProcess(hself, 0...原创 2020-03-14 10:27:25 · 2694 阅读 · 0 评论 -
windows多线程编程-事件详解
不得不说官方的例子写的是真的好,比网上乱七八糟代码好太多了,以后参考代码都以MSDN为主。先介绍一下CreateEvent这个函数的各个参数,这是重点HANDLE CreateEvent( LPSECURITY_ATTRIBUTES lpEventAttributes,// 安全属性 BOOL bManualReset,// 复位方式 BOOL bInitialS...原创 2020-01-11 09:56:07 · 515 阅读 · 1 评论 -
Windows下使用互斥对象的注意事项
相关API函数介绍HANDLECreateMutex( LPSECURITY_ATTRIBUTESlpMutexAttributes,//指向安全属性的指针 BOOLbInitialOwner,//初始化互斥对象的所有者,即创建的线程是否直接拥有互斥锁 LPCTSTRlpName//指向互斥对象名的指针);第三个参数,lpName是指定这把锁的名字. ...原创 2019-10-13 11:47:28 · 8688 阅读 · 0 评论 -
SendMessage导致的死锁问题
前言:试想这样一种场景:子线程通过SendMessage同步消息到主线程,假设子线程的结束是通过标志位来控制的。当主线程想要尝试结束子线程的时候一般是这样操作的,bFlag = false;WaitForSingleObject(hThread,INFINITE); //阻塞等待CloseHandle(hThread);将标志位置为false后,在子线程的主循环中肯定会判...原创 2019-09-28 20:33:54 · 11167 阅读 · 0 评论 -
stdcall和cdecl函数调用约定详解
前言看了网上各种关于stdcall和cdecl五花八门的解释,看了后让人初学者完全懵逼,甚至怀疑人生。这里我用通俗易懂的方式,给大家讲解一下原理。首先理解一个知识点,要知道前人为什么要这样做,而不那样做?优点?stdcall和cdecl都是函数调用约定之所以有不同的约定是由于历史原因,而且不同的编程语言有不同的调用约定,若要跨语言调用,则必须要了解函数调用约定。函数调...原创 2019-08-17 21:19:10 · 10524 阅读 · 0 评论 -
动态库静态库动态链接与静态链接详解
这里以Windows程序开发作为参考来讲解:首先DLL大家应该都知道,动态链接库(Dynamic Link Library 或者 Dynamic-link Library,缩写为 DLL),不知道的网上搜一下,稍微开发过Windows程序的小白都应该比较清楚,具体的概念不是本文的重点。动态链接是指一个项目A链接了一个动态链接库的项目B(项目B编译后生成的是DLL以及lib文件)。项目A...原创 2019-08-15 22:54:25 · 11158 阅读 · 2 评论 -
wmi常用列表
中文名字叫Windows管理规范。从Windows 2000开始,WMI(Windows 管理规范)就内置于操作系统中,并且成为了Windows系统管理的重要组成部分。WMI的本领如下:1.获取本地和远程计算机的硬件软件信息。2.监视本地和远程计算机的软件和服务等运行状况。3.控制本地和远程计算机的软件和服务运行。4.高级应用。常用列表如下:// 硬件Win32_Proce...原创 2018-12-25 22:08:17 · 11423 阅读 · 0 评论