StringCchCopyEx函数有自己的标志的值STRSAFE_NULL_ON_FAILURE和STRSAFE_NO_TRUNCATION。我正在读MSDN,我看不出它们的区别:
STRSAFE_NULL_ON_FAILURE 如果函数失败,则pszDest设置为空字符串(
TEXT(""))。在STRSAFE_E_INSUFFICIENT_BUFFER失败的情况下,任何截断的字符串都会被覆盖。 STRSAFE_NO_TRUNCATION 与STRSAFE_NULL_ON_FAILURE一样,如果函数失败,则pszDest设置为空字符串(TEXT(""))。在STRSAFE_E_INSUFFICIENT_BUFFER失败的情况下,任何截断的字符串都会被覆盖。
而且,我没有看到代码结果中有什么不同:
LPCTSTR pSrc = L"ASDFGHJK";
size_t charsCount = 5;
size_t buffer_size = charsCount * sizeof(TCHAR);
TCHAR *buffer = (TCHAR *) malloc(buffer_size);
ZeroMemory(buffer, buffer_size);
// Now I generate the STRSAFE_E_INSUFFICIENT_BUFFER result...
LPTSTR pDestEnd = NULL;
size_t remaind = 0;
// The MEMORY content after the StringCchCopyEx executing:
// 00 00 53 00 44 00 46 00 00 00 fd fd fd fd ab ab ab ab ab
// DWORD dwFlags = STRSAFE_FILL_BYTE('X') | STRSAFE_NO_TRUNCATION;
// The MEMORY content after the StringCchCopyEx executing:
// 00 00 53 00 44 00 46 00 00 00 fd fd fd fd ab ab ab ab ab
DWORD dwFlags = STRSAFE_FILL_BYTE('X') | STRSAFE_NULL_ON_FAILURE;
HRESULT result = StringCchCopyEx(buffer, charsCount, pSrc, &pDestEnd, &remaind, dwFlags);对于这两种情况,内存都有相同的内容..。STRSAFE_NO_TRUNCATION和STRSAFE_NULL_ON_FAILURE值有什么不同?
发布于 2015-10-30 12:55:01
一个安全的字符串函数与混乱的文档,什么会出错?两者的不同之处在于,当您还使用带有非零填充的STRSAFE_FILL_ON_FAILURE时,就会编写零终止符:
注意填充剂工作方式上的缺陷。可能是那些令人困惑的文档背后的原因。它只能是0到255之间的值,当然,这个值只能在StringCchCopyExA()中正常工作。Unicode版本将生成中文"塘塘塘塘“(在您的例子中),这几乎迫使您使用0作为填充。在这种情况下,确实没有什么区别了,而且文档是足够准确的。
https://stackoverflow.com/questions/33434131
复制相似问题