2015-10-30 29 views
3

對於自己的標誌,StringCchCopyEx函數的值爲STRSAFE_NULL_ON_FAILURESTRSAFE_NO_TRUNCATION。我讀MSDN,我看不出他們的區別:STRSAFE_NO_TRUNCATION和STRSAFE_NULL_ON_FAILURE值有什麼區別?

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_TRUNCATIONSTRSAFE_NULL_ON_FAILURE值的差異?

回答

1

一個安全的字符串函數,令人困惑的文檔,可能會出錯?兩者之間的區別也正是零終止寫入時,你也可以使用STRSAFE_FILL_ON_FAILURE與非零填料:如果你想看到的結果字符串中的填料

  • 使用STRSAFE_NO_TRUNCATION,零寫入最後。
  • 使用STRSAFE_NULL_ON_FAILURE總是得到一個空字符串。填料仍然是書面的,但過去了0.

請注意填料工作方式存在缺陷。混淆文檔背後的可能原因。它只能是0到255之間的一個值,當然只能對StringCchCopyExA()正確工作。 Unicode版本會產生中文,在你的情況下,「塘塘塘塘」幾乎迫使你使用0作爲填充。在這種情況下,確實沒有區別,文檔也足夠準確。