这几天在写个东西,其中有个函数,有这么几句
Code
const AnsiString ExtNames[] = {"", ".exe", ".com", ".bat"};
int Count = sizeof(ExtNames) / sizeof(AnsiString);
for (int i = 0; i < Count; i++)
{
AnsiString Result, FullPath(PathName + ExtNames[i]);
...
}
但是调试发现FullPath总是得于PathName,就是说ExtNames[i]没被加上。。。
花了2小时才发现问题。原来PathName是调用ExpandEnvironmentStrings得到的
Code
AnsiString __fastcall ExpandEnvironment(const AnsiString &PathName)
{
AnsiString Result;
Result.SetLength(MAX_PATH);
Result.SetLength(::ExpandEnvironmentStrings(PathName.c_str(), &Result[1], MAX_PATH));
return Result;
}
查MSDN发现,ExpandEnvironmentStrings返回的长度是包括了\0的。。。
所以返回的结果最后有个\0,不管你在后面加什么,编译器都认为字符串到\0就结束了,这就是问题所在
只要这么改下就好了
Result.SetLength(::ExpandEnvironmentStrings(PathName.c_str(), &Result[1], MAX_PATH) - 1);
其他如GetSystemDirectory返回的长度是不变包括\0的,所以没这个问题
把这个记下来,免得到时候自己忘了