C++如何屏蔽双击运行程序功能?
2013-07-18 14:55
197 查看
问题描述: 我们开发过程中可能会经常遇到,需要屏蔽EXE的双击运行功能,只能通过宿主程序(Service或EXE)来启动。比如腾讯的迷你弹窗,就只能通过主程序来启动,而不能直接通过双击来运行。
实现原理:宿主程序可以通过向子程序命令行参数可以来启动,而子程序在初始化的时候,会去检测当前的命令行参数是否匹配;如果匹配,就启动;如果不匹配,就不启动。
因为宿主程序可以通过CreateProcess来传递命令行参数,所以可以顺利执行;而双击程序,没有传递任何命令行参数,自然程序也就没法启动了。
程序示例:#define CMD_LINE _T("CommandLine")
子程序在程序初始化中进行判断,判断部分源码如下:(返回TRUE-运行程序; 返回FALSE-不运行程序)
BOOL IsExecuteWhenDbClk() { BOOL bRt = FALSE; int cmdLineCount = 0; LPWSTR* pCmdLine = ::CommandLineToArgvW(GetCommandLine(), &cmdLineCount); for ( int i = 0; i < cmdLineCount; i++ ) { if ( 0 == 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 = 0; LPWSTR* pCmdLine = ::CommandLineToArgvW(GetCommandLine(), &cmdLineCount); for ( int i = 0; i < cmdLineCount; i++ ) { wstring cmdLine(pCmdLine[i]); transform(cmdLine.begin(), cmdLine.end(), cmdLine.begin(), toupper); if ( 0 == 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 0, // 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 );
相关文章推荐
- Linux下如何编译、运行C、C++程序?
- [C/C++]_[初级]_[如何编写简单有效代码,提高程序运行效率和性能]
- 如何使用Xcode7软件添加NTL库并运行C++程序。
- Visual Studio 2005中如何编译和运行C++程序【转载】
- C++中如何计算程序运行的时间
- c++学习笔记(1)——环境搭建、经典教程推荐及 Visual Studio 2005/2008中如何编译和运行C++程序
- 如何在VC6.0中得到一个程序的运行时间,也就是这个程序耗费的时钟周期数// C和C++的时间编程
- 如何完全屏蔽Chrome的提示:"请停用以开发者模式运行的扩展程序"
- 《如何运行第一个C/C++语言程序》
- 如何去除MFC窗口的自动记忆功能 (如去除工具栏,菜单栏上次运行程序自动保存的内容)
- C++中如何求出程序的运行时间
- Visual Studio 2005中如何编译和运行C++程序
- 如何让打包的C++安装程序以管理员身份在Win7下运行
- sublime text3如何配置运行C++程序
- 扫盲贴 Visual Studio 2005/2008中如何编译和运行C++程序
- Ubuntu下在Eclipse IDE for C/C++ Developers中如何运行C语言的GTK程序?(已解决)
- linux下c++程序扔在后台运行,如何避免断开ssh会话,程序也关闭
- C++中如何计算程序运行的时间
- C/C++如何以秒计时程序运行时间
- linux下c++多线程下用CLOCK()函数统计程序运行时间 2012-12-11 12:46:01 分类: C/C++ clock()函数的功能: 这个函数返回从“开启这个程序进程”到