我在注册表中的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完全相同。没有返回错误代码。
什么是布莱恩?
答案 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.