问题描述: 我们开发过程中可能会经常遇到,需要屏蔽EXE的双击运行功能,只能通过宿主程序(Service或EXE)来启动。比如腾讯的迷你弹窗,就只能通过主程序来启动,而不能直接通过双击来运行。

实现原理:宿主程序可以通过向子程序命令行参数可以来启动,而子程序在初始化的时候,会去检测当前的命令行参数是否匹配;如果匹配,就启动;如果不匹配,就不启动。

      因为宿主程序可以通过CreateProcess来传递命令行参数,所以可以顺利执行;而双击程序,没有传递任何命令行参数,自然程序也就没法启动了。

程序示例:#define CMD_LINE _T("CommandLine")

子程序在程序初始化中进行判断,判断部分源码如下:(返回TRUE-运行程序; 返回FALSE-不运行程序)

BOOL IsExecuteWhenDbClk()
{
BOOL bRt = FALSE; int cmdLineCount = ;
LPWSTR* pCmdLine = ::CommandLineToArgvW(GetCommandLine(), &cmdLineCount); for ( int i = ; i < cmdLineCount; i++ )
{
if ( == CString(pCmdLine[i]).CompareNoCase( CString(CMD_LINE) ) )
{
bRt = TRUE;
break;
}
} GlobalFree( HGLOBAL(pCmdLine) ); return bRt;
}

上面的例子只支持MFC框架,下面提供一个跨平台使用的版本:

#ifndef TOOLS_H_
#define TOOLS_H_ #include <Windows.h>
#include <string>
#include <algorithm>
using namespace std; #define CMD_LINE L"AUTOINSTALL" BOOL IsExecuteWhenDbClk()
{
BOOL bRt = FALSE; int cmdLineCount = ;
LPWSTR* pCmdLine = ::CommandLineToArgvW(GetCommandLine(), &cmdLineCount); for ( int i = ; i < cmdLineCount; i++ )
{
wstring cmdLine(pCmdLine[i]);
transform(cmdLine.begin(), cmdLine.end(), cmdLine.begin(), toupper);
if ( == cmdLine.compare(CMD_LINE) )
{
bRt = TRUE;
break;
}
} GlobalFree( HGLOBAL(pCmdLine) ); return bRt;
} #endif // TOOLS_H_

宿主程序中,通过CreateProcess来启动,代码如下:

STARTUPINFO si;
PROCESS_INFORMATION pi; ZeroMemory( &si, sizeof(si) );
si.cb = sizeof(si);
ZeroMemory( &pi, sizeof(pi) ); // Start the child process.
wchar_t cmdLine[] = CMD_LINE; if( !CreateProcess( NULL,      // No module name (use command line)
         cmdLine, // Command line
         NULL, // Process handle not inheritable
         NULL, // Thread handle not inheritable
         FALSE, // Set handle inheritance to FALSE
         , // No creation flags
         NULL, // Use parent's environment block
         NULL, // Use parent's starting directory
          &si, // Pointer to STARTUPINFO structure
         &pi ) // Pointer to PROCESS_INFORMATION structure
)
{
printf( "CreateProcess failed (%d).\n", GetLastError() );
return;
} // Wait until child process exits.
//WaitForSingleObject( pi.hProcess, INFINITE ); // Close process and thread handles.
CloseHandle( pi.hProcess );
CloseHandle( pi.hThread );

C++如何屏蔽双击运行程序功能?的更多相关文章

  1. windows下用py2exe打包脚本为可双击运行程序

    文件夹结构: ├── readme.txt ├── settings.py #程序参数 ├── settings.pyc ├── setup.py    #安装文件 ├── spider.ico   ...

  2. 移动端H5页面如何屏蔽双击缩放的功能?(转)

    来自大佬的回答: 我在我们的页面中加了很多,除了ios10以上的safari不兼容以外还没有遇到过不兼容的情况. <!-- 视图窗口,移动端特属的标签. --> <meta name ...

  3. python os.startfile python实现双击运行程序 python监控windows程序 监控进程不在时重新启动

    用python监控您的window服务 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://world77.blog.51cto.co ...

  4. Window 注册程序关联后缀文件,双击运行

    一般来说,很多软件都会有自定义后缀的文件,比如.cpp..doc等,那么如果我们想把这些后缀与我们的软件关联起来,如何做呢 #pragma once #include "StdAfx.h&q ...

  5. php+javascript实现的动态显示服务器运行程序进度条功能示例

    本文实例讲述了php+javascript实现的动态显示服务器运行程序进度条功能.分享给大家供大家参考,具体如下: 经常有这样的业务要处理,服务器上有较多的业务需要处理,需要分批操作,于是就需要一个提 ...

  6. 双击jar文件运行程序

    Java应用程序jar文件可以由 JVM(Java虚拟机)直接执行,只要操作系统安装了JVM便可以运行作为Java应用程序的jar文件.可是,很多朋友遇到一个难题,那就是下载了jar文件以后在Wind ...

  7. 在windows中:双击运行Python程序、后台运行Python程序

    在windows中:双击运行Python程序.后台运行Python程序 安装Python解释器的windows环境,如果双击运行*.py的文件,会闪退.怎样避免闪退呢? 我们用python的日志输出程 ...

  8. AHK(1)之运行程序或打开文档

    小鸟学AHK(1)之运行程序或打开文档   AHK就是AutoHotKey,是一款免费的.Windows平台下开放源代码的热键脚本语言. 亲爱的朋友,叫我怎么向你推荐它呢! COOL,对,就是酷,那么 ...

  9. 以不同用户身份运行程序,/savecred只需要输入一次密码(GetTokenByName取得EXPLORER.EXE的令牌,然后调用CreateProcessAsUser,而且使用LoadUserProfile解决另存文件的问题)good

    http://blog.sina.com.cn/s/blog_65977dde0100s7tm.html ----------------------------------------------- ...

随机推荐

  1. js中访问对象的方法

    如果在js中定义了一个变量obj1,如 var obj1 = 234; 那么访问这个边个两的方式至少有两种, 1 window["obj1"],那么值为234, 2 var tar ...

  2. 第2章 Python基础语法--Hello python

    第2章 基础语法 2.1 基本介绍 2.1.1 Hello python 每个语言的开始都是从”HelloWorld”开始的,我们也不例外.打开已经安装好的Python编译环境,至于Python如何安 ...

  3. C陷阱与缺陷(四)

    第四章 连接 4.1 什么是连接器 C语言中的一个重要思想就是分别编译,即若干个源程序可以在不同的时候单独进行编译,然后在恰当的时候整合在一起.典型的连接器把由编译器或汇编器生成的若干个目标模块,整合 ...

  4. Chrome Firefox 自定义背景色

    Chrome有个自定义背景色的文件  Custom.css 默认里面什么字都没写 html, body {background-color: #e0dcc0!important;}      这个颜色 ...

  5. [Android文档翻译]设备兼容性

    原文地址:Device Compatibility Android设计于运行在多种不同类型的设备上,从手机.平板到电视.作为一名开发者,设备的涵盖范围为你的app提供了广大的潜在用户.为了让你的app ...

  6. windows apache 配置多个服务 站点 Apache Service Monitor

    把Apache安装为多个Window NT服务 ~~~ 可以在 services.msc中查看到1. 在DOS下跳到Apache安装目录里的bin目录(~~~或者用path命令 把apache的安装目 ...

  7. 自己动手搭建Nginx+memcache+xdebug+php运行环境绿色版 For windows版

    Nginx比apache要好,优点很多,随便去搜寻引擎找一下就能找到一大把资料,这不是我们讨论的重点,我们的重点是自己做一个运行组合!     為何我不從網上下載一個別人已經封裝好的現成的版本呢?因為 ...

  8. 基于visual Studio2013解决C语言竞赛题之0304整除数

      题目 解决代码及点评 按照题目要求,判断数值对3和5取模的结果,是否为0 #include <stdio.h> #include <stdlib.h> void m ...

  9. F#实现的单链表(函数式的思想)

    // 在 http://fsharp.net 上了解有关 F# 的更多信息 // 请参阅“F# 教程”项目以获取更多帮助. type list = | Nil | Cons of int * list ...

  10. iOS-容易造成循环引用的三种场景

    ARC已经出来很久了,自动释放内存的确很方便,但是并非绝对安全绝对不会产生内存泄露.导致iOS对象无法按预期释放的一个无形杀手是——循环引 用.循环引用可以简单理解为A引用了B,而B又引用了A,双方都 ...