由于项目需要,需要在主程序中调用一个外部A.exe程序,而A.exe程序因为通过开发商提供的SDK来编写的,并且无法与现有项目的开发平台兼容,不得已只有通过主程序利用CreateProccess来调用。但是前段时间发现一个问题,如果用户直接在主程序目录下双击运行A.exe,可能会导致程序界面某些地方显示出现问题。
基于上面的问题,要想办法做到:用户双击运行主程序目录下的A.exe后,A.exe不会直接运行,只有通过主程序相应的菜单操作,传入特定的命令行参数才能运行。这样做显得专业一点,不然用户直接双击就打开看到界面了不是显示没有多少技术含量了么。
于是周末有时间就打开MSDN看了下CreateProccess相关的详细说明,发现通过命令行传递参数的方式就基本可以解决这个问题了,基于MFC框架的程序可以直接在主程序初始化函数中直接获取命令行参数,并判断是否为为设定的主程序传入的参数,如果不是,返回false,程序将停止运行。
下面看下具体的例子:
A.exe中的代码如下:
// CXXXApp initialization BOOL CXXXApp::InitInstance() { //获取命令行参数 如果不是调用程序特定传入的参数“-XXXX”,则停止运行 2010/1/17 / int CommandLineCount = 0; LPWSTR * m_lpCommandLine = ::CommandLineToArgvW(GetCommandLineW(), &CommandLineCount); BOOL result = false; CString m_strCommandLine; //获取参数行命令,并将UNICODE转化成ASCI进行判断 for(int i = CommandLineCount - 1; i >= 0; i --)
{ m_strCommandLine = m_lpCommandLine[i]; if(m_strCommandLine == _T("-XXXX")) { result = true; break; } }
//释放内存 GlobalFree(HGLOBAL(m_lpCommandLine)); if(!result) return false; /
主程序调用代码:
if( !CreateProcess( "A.exe", // No module name (use command line). TEXT("-XXXX"), // Command line. 向采集程序传入特定参数运行调用采集程序,这样可防止用户鼠标直接双击采集程序运行 2010/1/17 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. ) { ; }
这样就OK了,现在双击A.exe它就不会甩你了。