gpt4 book ai didi

c++ - 如何克服在 VC++ 2013 中更改 PATH 环境变量的静默失败?

转载 作者:行者123 更新时间:2023-11-27 23:50:59 24 4
gpt4 key购买 nike

我的目标是编写代码,在 PATH 环境变量的现有值前面添加一个目录,并在程序运行期间将 PATH 环境变量设置为新值,这样 DLL 也可以从新目录加载与路径中先前的目录一样。代码只需要在 Windows 上运行,并且只需要使用 Visual C++ 2013 和 2015 进行编译。(理想情况下,我也希望能够使用 MinGW 进行编译,但是没有等同于/DELAYLOAD 的事实意味着这可能是不可能的。)

我发现,经过实验,SetEnvironmentVariable[W] 静默地无法更改 PATH 的值,但是 _putenv、_putenv_s、_wputenv 和 _wputenv_s 工作正常 --- 但仅在 VC++ 2015 上。在 VC++ 2013 上,它们静默地失败,并保持 PATH 的值不变(与 SetEnvironmentVariable 在 VC++ 2013 上静默失败的方式相同)。我在 Internet 上搜索的任何地方都没有找到任何关于此行为的引用资料。

我可以忍受使用 _putenv 而不是 SetEnvironmentVariable,但我需要找出一种在 VS2013 中动态更改 PATH 值的方法,即使它与 VS2015 中的工作方式不同。

更新:

这是 prependDirToEnvVarW()(和它调用的 getPathFromEnvVarW())。 prependDirToEnvVarW() 在 VC++ 2015 上正常工作,但在 VC++ 2013 上无法更改路径。

inline std::wstring getPathFromEnvVarW()
{
DWORD bufferSize = GetEnvironmentVariableW(L"PATH", NULL, 0);
std::wstring ret(bufferSize, wchar_t(0));
DWORD getPathEnv = GetEnvironmentVariableW(L"PATH", &ret[0], bufferSize);
return (getPathEnv ? ret : L"");
}

inline bool prependDirToEnvVarW(const std::wstring & wstrDir)
{
const std::wstring PATH_VAR_NAME = L"PATH";
std::wstring wstrPrevPath = getPathFromEnvVarW();
std::wstring wstrValue = wstrDir;
if (!wstrValue.empty() && wstrValue[wstrValue.length() - 1] != L';')
{
wstrValue += L";";
}
wstrValue += wstrPrevPath;

std::replace(wstrValue.begin(), wstrValue.end(), L'/', L'\\');

errno_t retVal = _wputenv_s(PATH_VAR_NAME.c_str(), wstrValue.c_str());
std::cout << "Attempted to change PATH to:\n" <<
std::string(wstrValue.cbegin(), wstrValue.cend()) << std::endl;
if (retVal == 0)
{
return true;
}
else
{
std::cout << "retVal is nonzero: " << retVal
<< " (compare to EINVAL == " << EINVAL << ")" << std::endl;
return false;
}
}

最佳答案

前提不正确。 PATH 是搜索 DLL 的最后

相反,您应该调用 SetDllDirectory()AddDllDirectory() .这会设置 DLL 搜索路径,以便您添加的路径在可执行文件目录之后第二个被搜索。

如果您需要比这更好的控制,您将需要为 LoadLibrary() 函数指定一个完整路径名。

关于c++ - 如何克服在 VC++ 2013 中更改 PATH 环境变量的静默失败?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46536827/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com