0

一些 api 需要字符数。

// Why did they choose cch in these functions.
HRESULT StringCchCopyW(
  __out  LPWSTR pszDest,
  __in   size_t cchDest,
  __in   LPCWSTR pszSrc
);

errno_t wcscpy_s(
   wchar_t *strDestination,
   size_t numberOfElements,
   const wchar_t *strSource 
);

DWORD WINAPI GetCurrentDirectoryW(
  __in   DWORD nBufferLength, // Count of Chars
  __out  LPWSTR lpBuffer
);  

有些 apis 需要字节数。

// What do you prefer cch vs cb function.
// Do cch functions almost useful?
HRESULT StringCbCopyW(
  __out  LPWSTR pszDest,
  __in   size_t cbDest,
  __in   LPCWSTR pszSrc
);

BOOL WINAPI ReadFile(
  __in         HANDLE hFile,
  __out        LPVOID lpBuffer,
  __in         DWORD nNumberOfBytesToRead,
  __out_opt    LPDWORD lpNumberOfBytesRead,
  __inout_opt  LPOVERLAPPED lpOverlapped
);

// Why did they choose cb in these structures.
// Because there are some apis uses cb, I always should see MSDN.
typedef struct _LSA_UNICODE_STRING {
  USHORT Length; // Count of bytes.
  USHORT MaximumLength; // Count of bytes.
  PWSTR  Buffer;
} UNICODE_STRING, *PUNICODE_STRING;

typedef struct _FILE_RENAME_INFO {
  BOOL   ReplaceIfExists;
  HANDLE RootDirectory;
  DWORD  FileNameLength; // Count of bytes.
  WCHAR  FileName[1];
} FILE_RENAME_INFO, *PFILE_RENAME_INFO;

在设计函数或数据结构时,如何确定 cb 或 cch?为什么?
要为调用者设计更好的 api,我应该知道什么?

4

2 回答 2

3

如果返回的数据是字符串,则应返回字符数,因为字节数通常无用。但是如果它是通用的二进制数据(而不是具体的字符串),那么显然字符数没有任何意义,所以使用字节数。

至于为什么:

我相信保留字节数的原因LSA_UNICODE_STRING是它应该与 兼容UNICODE_STRING,而后者又在NtCreateFile中使用。但是NtCreateFile接受一个FILE_OPEN_BY_FILE_ID参数,该参数实际上将UNICODE_STRING指向一个LONGLONG值,而不是一个字符串......所以字节数在那里更有意义,尽管我会说它总体上是一个糟糕的设计:

FILE_OPEN_BY_FILE_ID:由参数指定的文件名ObjectAttributes包括文件的 8 字节文件引用号。

于 2011-01-28T05:25:56.807 回答
0

如果您注意到,您提到的第一组函数都是 ASCII 函数,因此在这种情况下没有区别 - 字节数就是字符数。这是因为(通常,无论如何)单个 ASCII 字符的大小正好是一个字节。

第二组是 unicode 函数/结构。在这种情况下,不能保证字符的大小只有一个字节 - 如果在 UTF16 格式中它们将是两个字节宽,在 UTF32 中它们将是四个字节,而在 UTF8 中它们将(通常)在任何地方一到四个字节宽。

特别是在 UTF8 数据的情况下,如果您创建一个缓冲区,通常您会留出一定数量的bytes,这取决于字符大小,就字符数而言,长度可能是多种多样的。我对您提供的大多数函数/结构并不太熟悉,但如果这与它有关,我不会感到惊讶。

要回答您的问题,如果您正在使用 ASCII,您可以使用任何一种方法 - 这没有区别。但是,如果使用可变长度编码(例如 UTF8),您是否使用其中一种取决于您是否只对所涉及的字符感兴趣,或者您是否还需要考虑它们的编码。

于 2011-01-28T06:11:24.863 回答