始:exe需要依赖不同的第三方依赖库,若是把不同的exe放到一起,依赖的库也得放一起,这会显得臃肿,如何分目录管理?这就涉及到程序环境变量的应用。
过程与分析:1.cmd 中可以使用 set 来设置 临时环境变量,PATH 的改变将影响exe的运行
2.c++/mfc中使用 _dupenv_s/_putenv/SetEnvironmentVariable来设置和获取环境变量
3.PATH环境变量的变更需要在程序运行前才有效果
4.环境变量的更改+CreateProcess 将实现不同目录下执行需要的exe
代码: bool fly::run::exe(const char* dir, const char * cmdArgvs, bool isHide, bool isWait) { ?? ?? ?STARTUPINFO si; //一些必备参数设置 ?? ?memset(&si, 0, sizeof(STARTUPINFO)); ?? ?si.cb = sizeof(STARTUPINFO); ?? ?si.dwFlags = STARTF_USESHOWWINDOW; ?? ?si.wShowWindow = isHide ? SW_HIDE: SW_SHOW; ?? ?PROCESS_INFORMATION pi; //必备参数设置结束? ?? ?if (!CreateProcess(NULL, (char*)cmdArgvs, NULL, NULL, false, 0, NULL, dir, &si, &pi))?? ?? ?{ ?? ??? ?OutputDebugString("Create Fail!\n"); ?? ??? ?return false; ?? ?} ?? ?else ?? ?{ ?? ??? ?OutputDebugString("Create Sucess!\n"); ?? ??? ?if (isWait) ?? ??? ?{ ?? ??? ??? ?ResumeThread(pi.hThread); //唤醒线程 ?? ??? ??? ?WaitForSingleObject(pi.hProcess, INFINITE);//等待进程结束,时间:无限 ?? ??? ??? ?//关线程/进程 ?? ??? ??? ?CloseHandle(pi.hThread); ?? ??? ??? ?CloseHandle(pi.hProcess); ?? ??? ?} ?? ?} ?? ?return true; } void fly::run::setEnv(const char* envName, const char* envPaths) { ?? ?CString dirs = envPaths; ?? ?CString env = envName; ?? ?char *p = nullptr; ?? ?if (_dupenv_s(&p, 0, envName) == 0 && p) ?? ?{ ?? ??? ?if (CString(p) != dirs) ?? ??? ?{ ?? ??? ??? ?_putenv(env + "=" + dirs); ?? ??? ??? ?WinExec("setx.exe " + env + " " + dirs, SW_HIDE); ?? ??? ??? ?Sleep(1000); ?? ??? ?} ?? ??? ?free(p); ?? ?} ?? ?else ?? ?{ ?? ??? ?_putenv(env + "=" + dirs); ?? ??? ?WinExec("setx.exe " + env + " " + dirs, SW_HIDE); ?? ??? ?Sleep(1000); ?? ?} } CString fly::run::getEnv(const char * envName) { ?? ?CString env=""; ?? ?char *p = nullptr; ?? ?if (_dupenv_s(&p, 0, envName) == 0 && p) ?? ?{? ?? ??? ?env = p; ?? ??? ?free(p); ?? ?} ?? ?return env; } bool fly::run::useEnv(const char* envName) { ?? ?char *p = nullptr; ?? ?std::string env = "", path = ""; ?? ?if (_dupenv_s(&p, 0, envName) == 0 && p) ?? ?{ ?? ??? ?env = p; ?? ??? ?free(p); ?? ?} ?? ?else ?? ?{ ?? ??? ?return false; ?? ?} ?? ?if (_dupenv_s(&p, 0, "PATH") == 0 && p) ?? ?{ ?? ??? ?path = p; ?? ??? ?free(p); ?? ?} ?? ?else ?? ?{ ?? ??? ?return false; ?? ?} ?? ?SetEnvironmentVariable("PATH", (path+";"+env).c_str()); ?? ?return true; }
执行示例: ?? ?CString dirs; ?? ?auto dir = "D:\\test\\";?? dirs.Format("%s;%sui;%sopenvc;%sosg\\gdal;%sosg\\oe;%sosg\\osg;%sosg\\osg\\osgPlugins-3.6.5", dir, dir, dir, dir, dir, dir, dir); ? ? ? ? fly::run::setEnv("TEST_PATH", dirs); ? ?? ??? ?fly::run::useEnv("TEST_PATH"); ?? ??? ?fly::run::exe(dir, "test.exe");?
结:不同目录管理不同的exe,运行exe通过环境变量的设置来实现,这样能够很好的对程序目录进行管理
|