2012年11月2日 星期五

windows API StringCchCopy

HRESULT StringCchCopy( _Out_ LPTSTR pszDest, _In_ size_t cchDest, _In_ LPCTSTR pszSrc);

這個 API 有一個回傳值是
STRSAFE_E_INSUFFICIENT_BUFFER

這個值代表的意思是 dest buffer 太小了不足以放入 source buffer 裡面的字串
但是這個API還是會幫你把 source 裡的字串截斷後放入 dest buffer 裡面

我有點好奇
StringCchCopy 知道 dest buffer 大小就算了 它怎麼會知道 source buffer裡面的字串大小?

後來經過實驗 它會去偵測 source buffer 裡面的內容直到找到 '\0' 結尾 以此判斷來源字串大小
以下的 code 得以證實
第二次的結果就不會是 STRSAFE_E_INSUFFICIENT_BUFFER

#include <cstdio>#include <tchar.h>#include <StrSafe.h>int main(){  TCHAR buf[5] = {'a', 'b', 'c', 'd', 'e'};  TCHAR src[6] = {'1', '2', '3', '4', '5', '\0'};    HRESULT result = StringCchCopy(buf, 5, src);  if (STRSAFE_E_INSUFFICIENT_BUFFER == result)    puts("STRSAFE_E_INSUFFICIENT_BUFFER");  else    printf("%s\n", buf);  TCHAR src2[6] = {'1', '2', '3', '4', '\0', '5'};  result = StringCchCopy(buf, 5, src2);  if (STRSAFE_E_INSUFFICIENT_BUFFER == result)    puts("STRSAFE_E_INSUFFICIENT_BUFFER");  else    printf("%s\n", buf);  return 0;}

沒有留言:

張貼留言