ExpandEnvironmentStrings не расширяет мои переменные - PullRequest
2 голосов
/ 08 марта 2010

У меня есть процесс под ключом Run в реестре. Он пытается получить доступ к переменной среды, которую я определил в предыдущем сеансе. Я использую ExpandEnvironmentStrings, чтобы расширить переменную в пути. Переменная окружения является переменной профиля пользователя. Когда я запускаю свой процесс в командной строке, он также не расширяется. Если я вызываю «set», я вижу переменную.

Какой-то код ...

CString strPath = "\\\\server\\%share%"
TCHAR cOutputPath[32000]; 
DWORD result = ExpandEnvironmentStrings((LPSTR)&strPath, (LPSTR)&cOutputPath,  _tcslen(strPath) + 1);
 if ( !result )
 {
  int lastError = GetLastError();
  pLog->Log(_T( "Failed to expand environment strings. GetLastError=%d"),1, lastError);
 }

При отладке выходной путь в точности совпадает с путем. Код ошибки не возвращается.

Что происходит?

Ответы [ 3 ]

7 голосов
/ 08 марта 2010

Одной из проблем является то, что вы предоставляете неправильные параметры для ExpandEnvironmentStrings, а затем используете приведение, чтобы скрыть этот факт (хотя вам и требуется приведение, чтобы получить правильный тип из CString).

Вы также используете неправильное значение для последнего параметра. Это должен быть размер выходного буфера, а не размер входной длины (из документации the maximum number of characters that can be stored in the buffer pointed to by the lpDst parameter)

Сложив все это, вы хотите:

ExpandEnvironmentStrings((LPCTSTR)strPath,
                         cOutputPath,
                         sizeof(cOuputPath) / sizeof(*cOutputPath));
1 голос
/ 08 марта 2010

А как насчет buffersize? Инициализировано ли оно - к правильному значению?

В документации указано, что If the destination buffer is too small to hold the expanded string, the return value is the required buffer size, in characters.

1 голос
/ 08 марта 2010

Я не вижу кода проверки ошибок в вашем фрагменте, вы не подтверждаете возвращаемое значение. Если есть проблема, вы никогда ее не обнаружите. Кроме того, вы используете строки ANSI, остерегайтесь требования чудак для аргумента nSize (1 дополнительно).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...