功能:实现一个windows守护进程,设置有自定义图标,启动后隐藏黑窗口,获取exe所在目录,并设置开机自启动(需要以管理员权限运行)。如果需要打包成可执行的安装包程序,见另一篇博客:https://blog.csdn.net/qq_24977505/article/details/106415058。

隐藏控制台窗口:main函数前添加

#pragma comment(linker, "/subsystem:\"windows\"  /entry:\"mainCRTStartup\"" ) 即可。

设置自定义图标:Damon.exe设置heworld.ico图标,HelloWorld.exe没有

1、需要先自制一个ico格式图标,点开http://www.bitbug.net/ 上传图片即可做好。

2、将图标放到代码路径下,在vs项目中添加.rc文件(选中项目->右键添加->新建项->资源文件.rc->确定)。

3、到源文件目录记事本打开这个.rc文件,末尾添加 IDI_ICON1 ICON DISCARDABLE "heworld.ico" ,heworld.ico是第一步自作好的ico文件,一定要同在源文件目录下。

4、重新编译即可。

设置开机自启动代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <Windows.h>
#include <time.h>

// 设置黑窗隐藏
#pragma comment(linker, "/subsystem:\"windows\"  /entry:\"mainCRTStartup\"" )

// 需要守护的进程可执行文件,和daemon.exe放一起
#define PROCCESS_NAME "HelloWorld.exe"

char g_workPath[MAX_PATH] = { 0 };
void WriteLogFile(char *msg);

BOOL SetSelfStart()
{
    //获取程序完整名称
    char pName[MAX_PATH] = { 0 };
    GetModuleFileNameA(NULL, pName, MAX_PATH);

HKEY hKey = NULL;
    LONG lRet = NULL;
    const char * regeditPath = "Software\\Microsoft\\Windows\\CurrentVersion\\Run\\";
    if (ERROR_SUCCESS != RegOpenKeyExA(HKEY_LOCAL_MACHINE, regeditPath, 0, KEY_ALL_ACCESS, &hKey))
    {
        return FALSE;
    }

if (ERROR_SUCCESS != RegSetValueExA(hKey, "Heworld", 0, REG_SZ, (const unsigned char*)pName, strlen(pName) + sizeof(char)))
    {
        return FALSE;
    }

RegCloseKey(hKey);
    WriteLogFile("守护进程开机自启动成功\n");
    return TRUE;
}

void GetWorkPath(char *argv)//获取exe所在目录
{
    char drive[4];
    char subdir[MAX_PATH];
    char fn[MAX_PATH];
    char exten[MAX_PATH];

_splitpath_s(argv, drive, subdir, fn, exten);
    sprintf_s(g_workPath, "%s%s", drive, subdir);
}

int main(int argc, char *argv[])
{
    GetWorkPath(argv[0]);
    if (!SetSelfStart())
    {
        WriteLogFile("守护进程开机自启动失败\n");
    }

STARTUPINFOA si;
    PROCESS_INFORMATION pi;
    //初始化
    ZeroMemory(&si, sizeof(si));
    si.wShowWindow = SW_HIDE;
    si.cb = sizeof(si);
    ZeroMemory(&pi, sizeof(pi));

//构造cmd执行守护进程的字符串
    static char fileName[MAX_PATH] = { 0 };
    snprintf(fileName, MAX_PATH, "%s%s", g_workPath, PROCCESS_NAME);

do {
        if (!CreateProcessA(NULL, fileName, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi))
        {
            WriteLogFile("守护进程启动失败,程序即将退出\n");
            return -1;
        }

WriteLogFile("守护进程成功\n");
        WaitForSingleObject(pi.hProcess, INFINITE);
        WriteLogFile("守护进程退出......\n");
        //关闭进程和句柄
        CloseHandle(pi.hProcess);
        CloseHandle(pi.hThread);

Sleep(2000);
    } while (true);
    return 0;
}

const char *GetNowStr()
{
    static char nowstr[64];
    time_t nowTime = 0;
    time(&nowTime);

struct tm tmNow;
    localtime_s(&tmNow, &nowTime);
    sprintf_s(nowstr, "%02d%02d_%02d%02d%02d", tmNow.tm_mon + 1, tmNow.tm_mday,
        tmNow.tm_hour, tmNow.tm_min, tmNow.tm_sec);
    return nowstr;
}

void WriteLogFile(char *msg)
{
    static int writeLine = 0;
    static FILE* fp = NULL;
    if (fp == NULL)
    {
        char buf[1024];
        sprintf_s(buf, "%s%s", g_workPath, "daemon.log");
        fopen_s(&fp, buf, "w");
        if (fp == NULL)
        {
            printf("open log file fail\n");
            return;
        }
    }

static char header[128];
    sprintf_s(header, "[%s]:", GetNowStr());
    fwrite(header, 1, strlen(header), fp);
    fwrite(msg, 1, strlen(msg), fp);
    fflush(fp);

printf(msg);
    if (50000 < writeLine++)
    {
        fp = NULL;
        writeLine = 0;
    }
}

Windows守护进程实现/设置程序图标/隐藏黑窗/获取exe所在目录/设置开机自启动相关推荐

  1. Windows守护进程简单示例

    转载: https://blog.csdn.net/kikaylee/article/details/51395360 /* @描述:一个简单的Windows守护进程的例子(C++版本) @作者:ki ...

  2. 在Qt中设置程序图标的方法介绍

    本文主要介绍在 Qt 中设置程序图标的方法. 说明: 本文中的应用程序是面向 Windows 操作系统的: 本文中使用的 Qt Creator 版本号为:7.0.0: 本文中使用的 Qt 版本号为:5 ...

  3. android 自动打开第三方应用程序,Android如何做到应用程序图标隐藏,由第三方程序显示启动...

    Android如何做到应用程序图标隐藏,由第三方程序显示启动 发布时间:2020-07-13 03:25:02 来源:51CTO 阅读:11353 作者:ord1nary 在AndroidManife ...

  4. Qt for ios 设置程序图标(logo)和启动页(splash)

    前言 Qt开发ios程序,要面临的一个问题就是设置程序图标和启动页的问题,作为一个跨平台开发者,对原生开发本身就不太熟悉,即便是这种小功能也可能会成为阻碍,没办法, 只能硬着头皮上咯. 要设置ios的 ...

  5. 猫猫学IOS(二十一)UIApplication设置程序图标右上⾓红⾊数字_联⺴指⽰器等

    猫猫分享,必须精品 素材代码地址:http://blog.csdn.net/u013357243/article/details/45092629 原创文章,欢迎转载.转载请注明:翟乃玉的博客 地址: ...

  6. Qt笔记(十五)之设置程序图标

    一.前言 设置程序图标是使用Qt开发应用软件最基本的的东西,可是楼主一开始接触的时候捣鼓了许久,故在此做个记录 二.具体实现 1.准备工作 新建一个资源文件qrc(主要是为了统一管理图标文件) 添加需 ...

  7. Vs+Qt 设置程序图标

    Vs+Qt 设置程序图标 概述: 步骤示例: 运行效果图:(此时我们的图标设置成功) over: 文末一句话: 概述: 1.最近公司项目要进行一期交付(参与的第一个商业软甲),软件上一些好多的细节还没 ...

  8. word论文中如何任意设置页码?摘要不计页数?目录设置?取消页眉横线?

    最近在撸毕业论文,结果答辩的时候,因为格式问题被老师狂怼....心塞塞. 在此之前,明明发给了指导老师看过,老师那边也没有提出什么建议.结果就在答辩的时候被怼了.... 参考百度经验: 1. 在wor ...

  9. windows守护进程

    一.逻辑分析 1.windows没有fork函数,无法创建僵尸进程,使用打开非子进程的方式打开外部进程---打开外部进程 2.守护进程应该是单例的进程--->单例进程 3.守护进程应该是存在一个 ...

最新文章

  1. QT 的信号与槽机制介绍
  2. proxool配置多数据库多连接池
  3. 【计组实验】P3 Verilog多周期处理器开发 MIPS指令集
  4. new Grammar in 740 - internal table filter
  5. Visual Studio 2012中使用GitHub
  6. 安川最小巧机器人_2020工博会,安川展品前瞻(机器人篇)
  7. “携号转网”正式试运行,这两个原因或致无法转网
  8. mysql高级操作_MySQL数据库的高级操作
  9. ELK官方文档收集Kibana监视数据编辑
  10. 前端零碎问题(四)css3
  11. Dalsa线扫相机SDK下载和安装
  12. 酒店管理系统功能模块图
  13. 昆山花桥房都要上万 上海买家占9成“江山”
  14. 计算机函数sumifs应用题型难,在SUMIFS函数语句中使用Vlookup时遇到问题
  15. IP协议详解【IP报文头部结构、IP分片、IP路由、IP转发】
  16. 年、月、日格式正则表达式
  17. 2020 dns排名_《2020年全球DNS威胁报告》:DNS攻击平均损失高达92万美元
  18. java大小端字节流解析_记录一个如何解决java与C++socket通信的大小端问题
  19. 全国电子联行系统(EIS)、大额支付系统、
  20. web期末作业设计网页_传统文化设计题材_手工艺木雕

热门文章

  1. HTML5期末大作业:爱折扣电商购物网站设计——清新爱折扣电商购物网站(5页) HTML+CSS+JavaScript 关于电商的HTML网页设计-----网购
  2. 爱思助手更新后无法连接服务器,刷机提升 无法连接到苹果服务器 怎么解决
  3. C++一个简单的通讯录
  4. bitdefender_internetsecurity_2009_32b
  5. 机器人教育对思维能力和创新能力有益
  6. Javaweb项目入门到实战-搭建javaweb环境并运行(下)
  7. GITHUB设置代理——解决git clone下载过慢的问题
  8. 如何用搜狗拼音输入法输入各种上下标
  9. poj迷宫游戏c语言代码,ACM/ICPC 之 BFS-简单障碍迷宫问题(POJ2935)
  10. 页式存储,段式存储,段页式存储,引入快表等访存次数