В моем приложении мне нужен прямой доступ к переменной _environ, потому что у меня должно быть что-то вроде glibc unsetenv (этого не может быть с setenv или putenv).
Это код, который мне нужно использовать:
//////////////////////
// unsetenv for WIN32, taken from libc source
int unsetenv(const char *name)
{
size_t len;
char **ep;
if (name == NULL || *name == '\0' || strchr (name, '=') != NULL)
{
return -1;
}
len = strlen (name);
ep = _environ;
while (*ep != NULL)
if (!strncmp (*ep, name, len) && (*ep)[len] == '=')
{
/* Found it. Remove this pointer by moving later ones back. */
char **dp = ep;
do
dp[0] = dp[1];
while (*dp++);
/* Continue the loop in case NAME appears again. */
}
else
++ep;
return 0;
}
Он работал нормально, пока у нас не возникли проблемы с манифестами в некоторых системах, поэтому мы попытались использовать статическую версию библиотеки времени выполнения (/ MT flag).
Теперь я получаю эту ошибку:
unresolved external symbol __environ
Я прочитал здесь и во многих других местах, где эта переменная устарела и устарела. Интересно о возможном решении. Я также не могу использовать переменную _wenviron, потому что мы хотим поддерживать Windows 98.
В настройках проекта я явно настроил его на использование MBCS (т. Е. Не Unicode). Я немного споткнулся здесь. Что-нибудь еще, что я должен установить?
Просто для тестирования я также попробовал версию Unicode. То есть этот код:
int unsetenv(const wchar_t *name)
{
size_t len;
wchar_t **ep;
if (name == NULL || *name == '\0' || wcschr (name, '=') != NULL)
{
return -1;
}
len = wcslen (name);
ep = _wenviron;
while (*ep != NULL)
if (!wcsncmp (*ep, name, len) && (*ep)[len] == '=')
{
/* Found it. Remove this pointer by moving later ones back. */
wchar_t **dp = ep;
do
dp[0] = dp[1];
while (*dp++);
/* Continue the loop in case NAME appears again. */
}
else
++ep;
return 0;
}
Мне немного интересно, почему это даже скомпилировано, потому что я явно настроил его на использование MBCS, а не Unicode. Но, возможно, это означает что-то еще. (Может ли кто-нибудь просветить меня здесь?)
В любом случае, это приводит к следующим ошибкам:
1>AuxLib.obj : error LNK2001: unresolved external symbol __wenviron
1>ExtractInfo.obj : error LNK2001: unresolved external symbol __environ
AuxLib.obj - это файл с этим unsetenv (). Так что на одну ошибку больше, чем раньше.