“STRSAFE_NO_TRUNCATION”和“STRSAF E_NULL_ON_FAILURE”值的区别是什么
What the difference for the `STRSAFE_NO_TRUNCATION` and `STRSAFE_NULL_ON_FAILURE` values?
StringCchCopyEx
函数的值STRSAFE_NULL_ON_FAILURE
和STRSAFE_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_TRUNCATION
和STRSAFE_NULL_ON_FAILURE
的值有什么区别?
一个文档混乱的安全字符串函数,会出什么问题?当您还将STRSAFE_FILL_ON_FAILURE与非零填充符一起使用时,两者之间的区别正是零终止符的写入位置:
- 如果您想在结果字符串中看到填充符,请使用STRSAFE_NO_TRUNCTION,零写在末尾
- 使用STRSAFE_NULL_ON_FAILURE始终获取一个空字符串。填充符仍处于写入状态,但已超过0
请注意填充物的工作方式有缺陷。这些令人困惑的文档背后的可能原因。它只能是一个介于0和255之间的值,当然这只能真正适用于StringCchCopyExA()。Unicode版本将产生中文,"塘塘塘塘"在您的情况下,几乎迫使您使用0作为填充符。在这种情况下,确实没有任何区别,并且文档足够准确。
相关文章:
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- C++避免重复声明的语法是什么
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 实现无开销push_back的最佳方法是什么
- C++从另一个类访问公共静态向量的正确方法是什么
- "throw expression code" 1e7 >返回 d 是什么?投掷标准::overflow_error( "too big" ) : d;意味 着?
- C++中名称篡改的目的是什么
- 在 c++ 中拥有一组结构的正确方法是什么?
- 这个指针和内存代码打印是什么?我不知道是打印垃圾还是如何打印我需要的值
- 是什么阻止DOMTimerCoordinator::NextID进入无休止的循环
- 派生类销毁的最佳实践是什么
- 这个语法std::class<>{}(arg1, arg2) 在C++中是什么意思?
- 通过JNI传递数据数组的最快方法是什么
- "using namespace std;"在C++的作用是什么?
- 在两台机器之间进行时间戳的最佳c++chrono函数是什么
- 文件系统:复制功能的速度秘诀是什么
- 用常见虚拟函数实现的任意组合来实现派生类的正确方法是什么
- 使用QQuickFramebufferObject时同步数据的最佳方式是什么
- 是什么原因导致它无法编译?它是声明签名还是在函数本身的实现中
- 使用不同的CRT将新的C++代码与旧的(二进制)组件隔离开来的最佳方法是什么