ExpandEnvironmentStrings不扩展我的变量

时间:2010-03-08 19:30:44

标签: c++ winapi environment-variables

我在注册表中的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);
 }

调试时输出路径与Path完全相同。没有返回错误代码。

什么是布莱恩?

3 个答案:

答案 0 :(得分:7)

一个问题是你向ExpandEnvironmentStrings提供了错误的参数,然后使用强制转换来隐藏这个事实(尽管你需要一个强制转换来从CString中获取正确的类型)。

您还使用了错误的值作为最后一个参数。那应该是输出缓冲区的大小,而不是输入长度的大小(来自documentation 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 :(得分:1)

我没有在代码段中看到任何错误检查代码,您没有断言返回值。如果有问题,你永远不会发现它。此外,您正在使用ANSI字符串,请注意nSize参数的weirdo requirement(额外1个)。

答案 2 :(得分:1)

buffersize怎么样?它被初始化 - 到正确的价值吗?

文档说明If the destination buffer is too small to hold the expanded string, the return value is the required buffer size, in characters.