学习编程时候做的几个软件

自动点击鼠标
AutoClick.png
AutoClick.zip
源码:https://github.com/ClearSeve/AutoClick

批量密码生成
BatchPasswordGenerator.png
BatchPasswordGenerator.zip
源码:https://github.com/ClearSeve/BatchPasswordGenerator

硬盘取整
IntegerPartition.png
IntegerPartition.zip
源码:https://github.com/ClearSeve/IntegerPartition

植物大战僵尸外挂
PZTools.png
PZTools.zip
源码:https://github.com/ClearSeve/PZTools

qq邮箱生成
QQMail.png
QQMail.zip
源码:https://github.com/ClearSeve/QQMail

cJson 库的使用, C语言/C++解析json

这个数据是为了做讲解随便写了一个, 要解析如下的数据:

{"DataDate":"2017-10-10",
"DateTime":"14:20",
"UserList": [
{"Name":"ClearSeve1","age":"15"},
{"Name":"ClearSeve2","age":"20"},
{"Name":"ClearSeve3","age":"30"},
{"Name":"ClearSeve4","age":"40"}
]}

可以使用可视工具, 让json结构层次更清晰, 百度搜索 json在线解析, 就可以搜到了.
这次用的是cJSON库, 用来解析json. cjson库在文章末尾下载

效果图:
QQ截图20171110145340.jpg

完整的解析代码

#include 

#include "Lib/cJSON/cJSON.h"

int main()
{
    // 填入需要解析的json字符串, 返回对象
    cJSON* pJson = cJSON_Parse("{\"DataDate\":\"2017-10-10\",\"DateTime\":\"14:20\",\"UserList\": [{\"Name\":\"ClearSeve1\",\"age\":\"15\"},{\"Name\":\"ClearSeve2\",\"age\":\"20\"},{\"Name\":\"ClearSeve3\",\"age\":\"30\"},{\"Name\":\"ClearSeve4\",\"age\":\"40\"}]}");
    if (pJson!=NULL)
    { // 创建成功
        // 得到DataDate 和 DateTime
        cJSON* pDataDate = cJSON_GetObjectItem(pJson, "DataDate");
        if (pDataDate != NULL)
        {
            printf("数据日期:%s\n", pDataDate->valuestring);
        }

        cJSON* pDataTime = cJSON_GetObjectItem(pJson, "DateTime");
        if (pDataTime != NULL)
        {
            printf("数据时间:%s\n", pDataTime->valuestring);
        }

        // 查找数组节点
        cJSON* pUserList = cJSON_GetObjectItem(pJson, "UserList");
        if (pUserList != NULL)
        {
            // 获取元素个数
            int nItem = cJSON_GetArraySize(pUserList);
            // 遍历数组
            for (int i = 0; i < nItem; ++i)
            {
                cJSON* pUserListSub = cJSON_GetArrayItem(pUserList, i);
                if (pUserListSub != NULL)
                {
                    // 获取Name和age
                    cJSON* pName = cJSON_GetObjectItem(pUserListSub, "Name");
                    cJSON* pAge = cJSON_GetObjectItem(pUserListSub, "age");
                    if (pName != NULL&&pAge != NULL)
                    {
                        printf("姓名:%s 年龄:%s\n", pName->valuestring, pAge->valuestring);
                    }
                }
            }
            

        }


        // 释放解析对象
        cJSON_Delete(pJson);
    }


    return 0;
}

库:cJSON.zip
演示:项目Demo.zip

一个最基本的ATL窗口程序创建

项目的创建与配置

创建一个空项目
1.jpg
在创建好的项目右击属性, 点击配置选择所有配置.
常规下的项目默认值中的字符集选项, 修改为使用Unicode字符集
2.jpg

定义WinMain入口函数

右击项目添加->新建项->Visual C++->C++ 文件在这里我添加的cpp文件名是MainFrame.cpp
在cpp文件添加如下代码

int CALLBACK WinMain( HINSTANCE hInstance,  HINSTANCE hPrevInstance,  LPSTR lpCmdLine,  int nShowCmd)
{
    // 主消息循环: 
    MSG msg = { 0 };
    while (GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return 0;
}

如图下:
4.jpg

定义CMainFrame类

右击项目添加->->Visual C++->C++ 类, 在这里我用的类名是CMainFrame
在MainFrame.h文件下
添加两个头文件

#include 
#include 

公有父类为CWindowImpl // CMainFrame是自己创建的类名

public: // 事件的分发处理
    BEGIN_MSG_MAP(CMainFrame) // 在这里我用的类名是`CMainFrame`
        MESSAGE_HANDLER(WM_DESTROY, OnDestroy)
    END_MSG_MAP()

// OnDestroy 函数的实现

public:
    LRESULT OnDestroy(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandle)
    {
        PostQuitMessage(0);
        return 0;
    }

在回到一开始创建的MainFrame.cpp文件
添加头文件(自己创建的类头文件)

#include "MainFrame.h"

在WinMain执行体的最开始添加代码

CMainFrame MainFrame;
MainFrame.Create(NULL, CMainFrame::rcDefault, _T("ATLWindow"), WS_OVERLAPPEDWINDOW);
MainFrame.ShowWindow(nShowCmd);
MainFrame.UpdateWindow();

如图:
5.jpg

这样我们创建的第一个atl窗体程序就可以运行了
6.jpg

完整代码下载:
ATLWindow.zip

系统右键菜单添加自定义菜单项

基本环境

1.jpg
添加项Visual C++ -> ATL -> ATL项目
2.jpg
应用程序类型: 动态链接库dll
支持选项全不勾选, 包括新版的生命周期安全检查点击完成

3.jpg
4.jpg
在atl项目右击添加->类->ATL简单对象,简称为MyShellMenu 点击下一步
5.jpg
线程模型:单元 (Threading model: Apartment )
聚合: (Aggregation: No)
接口:自定义 (Interface: Custom )

打开MyShellMenu.h
添加头文件#include
删除 public IMyShellMenu
删除 COM_INTERFACE_ENTRY(IMyShellMenu)
完成以上操作如下图:
6.jpg

IShellExtInit

添加公有接口继承public IShellExtInit
添加接口查询线路COM_INTERFACE_ENTRY(IShellExtInit)
完成以上操作如下图:
7.jpg

在类里面声明和实现函数

public:
// 定义字符串缓冲区
TCHAR m_strBuffer;
// 实现函数
HRESULT Initialize(
  [in] PCIDLIST_ABSOLUTE pidlFolder,
  [in] IDataObject       *pdtobj,
  [in] HKEY              hkeyProgID
);

IContextMenu

QT Create Error while building/deploying project planets

修改项目 构建目录
点开”项目” 概要 “构建目录” 设置一个目录

设置默认构建目录
打开qt create 点击工具->选项
找到构建和运行 在概要 最后一项”default build directory” 设置../build-%{CurrentProject:Name}-%{CurrentKit:FileSystemName}-%{CurrentBuild:Name}
点击ok

C语言顺序表

推荐使用环境:
表长度不大
不做(少做)插入/删除
只在表的端点插入/删除

添加

for (int i = 数组长度-1; i >=插入位置; i--)
{
    数组[i + 1] = 数组[i];
}
数组[位置] = 数据;

删除

for (int i = 删除位置; inRight)
    {
        return -1;
    }
    // 判断是否与结果相同
    if (nFindData==nArray[nMid])
    { // 返回下表
        return nMid;
    }
    // 当前值比查找的要小
    if (nArray[nMid]nRight)
    {
        return -1;
    }
    // 判断是否与结果相同
    if (nFindData==nArray[nMid])
    { // 返回下表
        return nMid;
    }
    // 当前值比查找的要小