“STRSAFE_NO_TRUNCATION”和“STRSAF E_NULL_ON_FAILURE”值的区别是什么

What the difference for the `STRSAFE_NO_TRUNCATION` and `STRSAFE_NULL_ON_FAILURE` values?

本文关键字:FAILURE 是什么 区别 ON STRSAF NO STRSAFE TRUNCATION NULL      更新时间:2023-10-16

StringCchCopyEx函数的值STRSAFE_NULL_ON_FAILURESTRSAFE_NO_TRUNCATION用于自己的标志。我正在阅读MSDN,我看不出它们的区别:

STRSAFE_NULL_ON_FAILURE

如果函数失败,pszDest将设置为空字符串(TEXT(""))。在STRSAFE_E_INSUFFICIENT_BUFFER故障的情况下,任何截断的字符串被覆盖。

STRSAFE_NO_RUNCATION

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_TRUNCATIONSTRSAFE_NULL_ON_FAILURE的值有什么区别?

一个文档混乱的安全字符串函数,会出什么问题?当您还将STRSAFE_FILL_ON_FAILURE与非零填充符一起使用时,两者之间的区别正是零终止符的写入位置:

  • 如果您想在结果字符串中看到填充符,请使用STRSAFE_NO_TRUNCTION,零写在末尾
  • 使用STRSAFE_NULL_ON_FAILURE始终获取一个空字符串。填充符仍处于写入状态,但已超过0

请注意填充物的工作方式有缺陷。这些令人困惑的文档背后的可能原因。它只能是一个介于0和255之间的值,当然这只能真正适用于StringCchCopyExA()。Unicode版本将产生中文,"塘塘塘塘"在您的情况下,几乎迫使您使用0作为填充符。在这种情况下,确实没有任何区别,并且文档足够准确。