2010-03-08 2 views
2

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

Некоторый код ...

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); 
} 

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

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

+0

Я предполагаю, что 'strPath == Path' и 'cOutputPath == OutputPath', но небольшая санитария поможет. –

+0

Пожалуйста, введите действующий код. Вы определяете переменные 'strPath' и' cOutputPath', а затем используете переменные 'Path' и' OutputPath'. –

ответ

6

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

Вы также используете неправильное значение для последнего параметра. Это должен быть размер выходного буфера, а не размер длины входного сигнала (от documentationthe 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)); 
+0

Прямо на голове. Благодарю. Мне просто нужно не торопиться с этим бизнесом на C++ ... .Net сделал меня ленивым ... –

1

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

+0

Я обновил сообщение, чтобы лучше отразить мой код. И я заметил это странное требование для ANSI. Функция не возвращает ошибку. : \ Просто кажется, ничего не делает! –

+1

@ Адам: это не помогло. Как связаны strPath и Path? Почему вы бросаете? Кастинг - это плохо. –

+0

Извините, обновите код. Я кастинг, потому что компилятор жаловался ... отличная идея? –

1

Что относительно buffersize? Инициализировано ли оно - правильное значение?

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

Смежные вопросы