- 博客(117)
- 资源 (6)
- 收藏
- 关注
原创 AppData文件夹下Local,Locallow和Roaming
Appdata下有三个子文件夹local,locallow,roaming的具体含义
2022-06-27 10:36:53
8673
原创 关闭SQLite3中的journal暂存档
相信很多使用SQLite3当做数据库的人都会一个现象,那就是当SQLite3有做写入的动作时,SQLite3会自动产生一个名为"数据库名称-journal"的暂存档。这是做什么用的呢?答案是用来Rollback ,换句话说,就是当数据写入数据库有失败动作时,透过journal档案予以复原到未更动前(原始)数据,来确保数据完整与一致性。如果在每次写入的时间很长或频繁的进行数据库写入情况下,因系统(主机)电力不稳或突然断电时,那么下次重新启动,而journal档案若存在,则在开启SQLite数据库时,若发现有
2022-05-23 10:43:46
1633
原创 c+11新特性-thread
1.std::thread类成员函数:(1) get_id:获取线程ID,返回一个类型为std::thread::id的对象。(2) joinable:检查线程是否可被join。检查thread对象是否标识一个活动(active)的可行性线程。缺省构造的thread对象、已经完成join的thread对象、已经detach的thread对象都不是joinable。(3) join:调用该函数会阻塞当前线程。阻塞调用者(caller)所在的线程直至被join的std::thread对象标识的线程执行结束
2022-05-15 16:08:28
638
原创 基于CS模式的共享内存与事件
基于CS模式的共享内存与事件//service.cpp#include <windows.h>#include <iostream>using namespace std;#define BUF_SIZE 4096 //size of Share memory File mapping#define FM_RECV_NAME "Global\\Send" //name of the file mapping to receive #de
2022-05-13 22:00:52
161
原创 进程间通信-互斥锁
1.CreateMutex()//创建一个互斥体,已经存在会直接返回句柄OpenMutex()//打开一个互斥体WaitForSingleObject()//尝试加锁ReleaseMutex()//解锁2.进程间互斥通过互斥锁的名称进行3.如果是服务进程与普通进程进行通信要注意!!!!!!!!!!!!!!!!!!!HANDLE hNutex = CreateMutex(NULL, FALSE, L"Local\\eee"); //创建本地内核对象 HANDLE hNutex = Create
2022-04-26 15:17:10
635
转载 声明为全局变量
声明为全局变量C++中定义全局变量是应该尽量在.cpp文件中定义,而不要在.h 文件中 定义,定义好了之后,可以在.h文件中利用extern关键字进行声明。如果在.h文件中定义的话,多层包含可能会引起重复定义的错误。下面是一个示例:在g_bash.cpp中定义全局变量:// g_bash.cpp#include “g_base.h”int g_TicketCount = 0; // 定义全局变量并初始化在g_bash.h文件中利用extern关键字进行声明:// g_bash.h#ifnd
2022-04-20 23:15:26
2317
原创 windows 系统开启的端口调研
WINDOWS常用端口列表1.windows常见端口端口号的范围是从1~65535。其中1~1024是被RFC 3232规定好了的,被称作“众所周知的端口”(Well Known Ports);从1025~65535的端口被称为动态端口(Dynamic Ports),可用来建立与其它主机的会话,也可由用户自定义用途。一些常见的端口号及其用途如下:21端口:FTP 文件传输服务22端口:SSH 端口23端口:TELNET 终端仿真服务25端口:SMTP 简单邮件传输服务53端口:DNS 域名解
2022-04-20 14:42:49
1003
原创 vs中的多字节与unicode
ANSI(即MBCS): 为多字节字符集,它是不定长表示世界文字的编码方式。ANSI表示英文字母时就和ASCII一样,但表示其他文字时就需要用多字节(在处理中文字符时 使用双字节方式)。ANSI字符采用8bit,能表示256种字符,表示26个英文字母是绰绰有余的,但是表示汉字,韩国语,日语等有着成千上万个字符的非西方字符肯定就不够了。Unicode: 不管是英文字符还是中文字符都是采用双字节方式表示。比如字符 ‘A’ 在 ASCII 下面用一个字节表示,而在Unicode下面用两个字节表示,其中高字节用
2022-02-27 16:24:28
848
原创 sqlite3加密版
sqlite3加密版1.lib、dll 在github上的下载地址https://github.com/rindeal/SQLite3-Encryption2.加密接口相关说明// 解密或用于第一次加密int sqlite3_key(sqlite3 *db, const void *zKey, int nKey);// 重设密码int sqlite3_rekey(sqlite3 *db, const void *zKey, int nKey);sqlite3_key是输入密钥,如果数据库已加
2022-02-22 15:31:16
1775
原创 sqlite编译
1、下载sqlite3源码:http://www.sqlite.org/download.html主要是sqlite-amalgamation-XXXXXXX.zip、sqlite-dll-win32-x86-XXXXXXX.zip、sqlite-dll-win32-x64-XXXXXXX.zip动态库编译:ps:如果没有特殊要求,可直接使用下载的sqlite-dll-*********.zip内的dll,那如果不放心就自己编译。1、使用vs2010创建win32工程,然后选择DLL和空项目,正常情
2022-01-28 18:26:11
919
原创 修改注册表的值
#include<iostream>#include <string>#include <vector>#include <windows.h>#include <wincrypt.h>#include <Windows.h>#include <iostream>#include "shellapi.h"#include <locale>#include <codecvt>#inc
2022-01-07 15:31:38
970
原创 客户端软件增量更新
增量更新使用到一个开源库bsdiff,bsdiff是一个差分算法,原理是旧文件跟新文件对比,尽可能多的利用old文件中已经有的内容,尽可能少的加入新的内容来构建new文件。通常的做法是对旧文件和新文件做字符串匹配或者使用hash技术提取公共部分,然后把新文件的剩余部分打成patch包(差分包中记录着新内容相对旧内容的偏移地址),在Patch阶段中用copying和insertion两个操作把旧文件和patch文件合成新文件。增量更新的流程: 在服务器端,使用bsdiff工具把旧的apk和新的apk进
2022-01-07 10:37:45
2852
原创 生成快捷方式
void MakeShortCut() { HRESULT hr = CoInitialize(NULL); if (SUCCEEDED(hr)) { IShellLink* pisl; hr = CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, IID_IShellLink, (void**)&pisl); if (SUCCEEDED(hr)) { IPersistFile* pIPF;
2022-01-07 10:12:48
109
原创 自删除c++代码
void InitFile::DeleteApplicationSelf(){ char szCommandLine[MAX_PATH + 10]; //设置本进程为实时执行,快速退出。 SetPriorityClass(GetCurrentProcess(), REALTIME_PRIORITY_CLASS); SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_TIME_CRITICAL); //通知资源管理器不显示本程序,当然如果程
2021-12-28 17:35:28
2207
转载 vs中能编译通过,但是会有红色下划线提示未定义标示符问题
项目能编译通过,但是代码中会有红色下划线提示未定义标示符。就连BOOL TRUE FALSE等都会有下划线。这通常是该代码文件包含在项目文件夹的子文件夹中。解决办法是配置包含项目目录即可:打开项目属性-》配置属性-》C/C++常规-》附加包含目录-》填入:$(ProjectDir)...
2021-11-18 14:09:51
479
原创 vs2019开发linux的cmake项目
开发环境:vs2019+Ubuntu 20.04.3 LTS linux环境配置1.ubuntu服务器设置允许root用户登录修改ssh配置文件sudo vim /etc/ssh/sshd_config后进入配置文件中修改PermitRootLogin后的默认值为yessudo service ssh restart 重新登录即可2.opnssh 用于vs进行远程连接:安装命令sudo apt-get install openssh-server4.安装C++ 编译器 gdb CMa
2021-11-11 17:28:10
2149
原创 日志写法(带时间)
#include <windows.h>#include <stdio.h> /// <summary>/// 写日志文件/// </summary>/// <param name="msg"></param>/// <param name="value"></param>void CwriteLog(std::string msg) { SYSTEMTIME sys; GetLocalTi
2021-10-28 17:44:16
153
原创 KMP算法
#include <iostream>#include <cstring>#include <string>#include <set>#include <map>using namespace std;void BuildPatchMatchTable(int* partMatchTable, char* findstr){ if (findstr == NULL) return; partMatc
2021-10-25 19:37:28
81
1
原创 WMI技术介绍和应用
1.WMI技术介绍和应用——WMI概述https://fangliang.blog.csdn.net/article/details/8424317总结:WMI由三部分组成: WMI Consumers(WMI使用者) WMI Infrastructure(WMI基础结构)---WMI基础结构是Windows系统的系统组件。它包含两个模块:包含WMI Core(WMI核心)的WMI Service(WMI服务)(Winmgmt)和WMI Repository(WMI存储库)。 Manage
2021-10-25 00:36:03
789
转载 Windows 下 根据进程名获取进程ID 以及该进程下所有窗口的句柄
#include <windows.h>#include <stdint.h>#include <tlhelp32.h>#include <stdio.h>#include <iostream>#include <vector>typedef struct EnumHWndsArg{ std::vector<HWND>* vecHWnds; DWORD dwProcessId;}EnumHWndsArg
2021-09-16 17:15:36
3677
转载 Windows 下 根据进程名获取进程ID 以及该进程下所有窗口的句柄
#include <windows.h>#include <stdint.h>#include <tlhelp32.h>#include <stdio.h>#include <iostream>#include <vector>typedef struct EnumHWndsArg{ std::vector<HWND>* vecHWnds; DWORD dwProcessId;}EnumHWndsArg
2021-09-16 17:14:59
1498
原创 C++11 unique_ptr、shared_ptr 以及 weak_ptr 智能指针
1.引言在实际的 C++ 开发中,我们经常会遇到诸如程序运行中突然崩溃、程序运行所用内存越来越多最终不得不重启等问题,这些问题往往都是内存资源管理不当造成的。比如:有些内存资源已经被释放,但指向它的指针并没有改变指向(成为了野指针),并且后续还在使用;有些内存资源已经被释放,后期又试图再释放一次(重复释放同一块内存会导致程序运行崩溃);没有及时释放不再使用的内存资源,造成内存泄漏,程序占用的内存资源越来越多。针对以上这些情况,很多程序员认为 C++ 语言应该提供更友好的内存管理机制,这样就可以将精
2021-09-08 21:45:08
125
原创 C++11 nullptr:初始化空指针
C++11 nullptr:初始化空指针1.NULL 并不是 C++ 的关键字,它是 C++ 为我们事先定义好的一个宏,并且它的值往往就是字面量 0(#define NULL 0)。C++ 中将 NULL 定义为字面常量 0,虽然能满足大部分场景的需要,但个别情况下,它会导致程序的运行和我们的预期不符。2.#include <iostream>using namespace std;void isnull(void *c){ cout << "void*c" &
2021-09-08 21:08:32
578
1
原创 C++11引用限定符的用法
C++11引用限定符的用法C++11 新添加了引用限定符。所谓引用限定符,就是在成员函数的后面添加 “&” 或者 “&&”,从而限制调用者的类型(左值还是右值)。const 和引用限定符修饰类的成员函数时,都位于函数的末尾。C++11 标准规定,当引用限定符和 const 修饰同一个类的成员函数时,const 必须位于引用限定符前面。需要注意的一点是,当 const && 修饰类的成员函数时,调用它的对象只能是右值对象;当 const & 修饰类的
2021-09-06 20:32:17
312
原创 C++11 constexpr和const的区别详解
C++11 constexpr和const的区别详解1.const 用于为修饰的变量添加“只读”属性;2.而 constexpr 关键字则用于指明其后是一个常量(或者常量表达式),编译器在编译程序时可以顺带将其结果计算出来,而无需等到程序运行阶段,这样的优化极大地提高了程序的执行效率。3.C++ 11标准中,为了解决 const 关键字的双重语义问题,保留了 const 表示“只读”的语义,而将“常量”的语义划分给了新添加的 constexpr 关键字。因此 C++11 标准中,建议将 con
2021-09-06 18:02:38
635
2
转载 C++ 11 标准for循环
C++ 11 标准中,除了可以沿用前面介绍的用法外,还为 for 循环添加了一种全新的语法格式,如下所示:for (declaration : expression){//循环体}其中,两个参数各自的含义如下:declaration:表示此处要定义一个变量,该变量的类型为要遍历序列中存储元素的类型。需要注意的是,C++ 11 标准中,declaration参数处定义的变量类型可以用 auto 关键字表示,该关键字可以使编译器自行推导该变量的数据类型。expression:表示要遍历的序列,常见
2021-09-06 16:07:32
639
原创 C++POD 类型
POD 类型一般具有以下几种特征(包括 class、union 和 struct等):没有用户自定义的构造函数、析构函数、拷贝构造函数和移动构造函数。不能包含虚函数和虚基类。非静态成员必须声明为 public。类中的第一个非静态成员的类型与其基类不同,例如:class B1{};class B2 : B1 { B1 b; };class B2 的第一个非静态成员 b 是基类类型,所以它不是 POD 类型。在类或者结构体继承时,满足以下两种情况之一:派生类中有非静态成员
2021-09-06 15:47:18
172
原创 VS 2019 编译程序在其它电脑运行报丢失VCRUNTIME140D.dll 【终极解决方案】
VS 2019 编译程序在其它电脑运行报丢失VCRUNTIME140D.dll 【终极解决方案】https://blog.csdn.net/bai_ge_i_yin/article/details/108755221?utm_medium=distribute.pc_relevant.none-task-blog-2~default~baidujs_title~default-0.no_search_link&spm=1001.2101.3001.4242...
2021-09-06 11:25:28
1139
原创 将十六进制的字符串转换成十进制整数
/// <summary>/// 将十六进制的字符串转换成十进制整数/// </summary>/// <param name="s"></param>/// <returns></returns>int HexCovertDEC(const char s[]){ int i, m, temp = 0, n; m = strlen(s);//十六进制是按字符串传进来的,所以要获得字符串长度 for (i = 0;i &
2021-09-02 20:57:05
1248
原创 string转LPCTSTR类型
LPCTSTR不是一个类型,而是两种类型:LPCSTR和LPCWSTR其中之一。会根据你当前程序是否使用UNICODE字符集来变成那二者之一。如果使用UNICODE字符集,则LPCTSTR = LPCWSTR,如果使用Multi-Byte字符集,则LPCTSTR = LPCSTR。//Multi-Byte编码下, string转LPCSTR(LPCTSTR)类型: string str = "hello, I'm string";LPCSTR strtmp1 = str.c_str(); //
2021-09-02 20:09:45
7894
原创 vector中erase去除重复数据
int sFindSameName(vector<SOFTINFO> softVector, string name){ int count = 0; auto iter = softVector.begin(); //注册表 for (; iter != softVector.end(); iter++) { if (((*iter).m_strSoftName == name)) { count++; } } return count;}void sS
2021-09-02 15:01:52
275
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人