Функция StringCchCopyEx - замена функции strcpy. Размер, в символах, целевого буфера назначается в функцию для того, чтобы гарантировать, что StringCchCopyEx не запишет помимо конца этого буфера. StringCchCopyEx добавляет к функциональным возможностям функции StringCchCopy возвращение указателя на конец строки, являющаяся выходным значением, а так же число символов, оставшееся неиспользованным в этой строке. В функцию для дополнительного управления могут также передаваться флажки.
HRESULT StringCchCopyEx( LPTSTR pszDest, size_t cchDest, LPCTSTR pszSrc, LPTSTR *ppszDestEnd, size_t *pcchRemaining, DWORD dwFlags ); |
[out] Указатель на буфер, который получает скопированную строку.
cchDest[in] Размер целевого буфера, в символах. Это значение должно равняться длине pszSrc плюс 1, чтобы принять во внимание скопированную исходную строку и символ завершающего нуля. Максимальное число допустимых символов является STRSAFE_MAX_CCH.
pszSrc[in] Указатель на буфер, содержащий исходную строку. Эта исходная строка должна быть завершена символом конца строки ('\0').
ppszDestEnd[out] Адрес указателя на конец pszDest. Если ppszDestEnd не-NULL, и какие-либо данные копируются в целевой буфер, то он указывает на символ завершающего нуля в конце строки.
pcchRemaining[out] Указатель на переменную, который указывает число неиспользуемых символов в pszDest, включая символ завершающего нуля. Если pcchRemaining - NULL, подсчет не сохраняется или возвращается значение.
dwFlags[in] Используется одно или несколько нижеперечисляемых значений.
Флажок |
Предназначение |
STRSAFE_FILL_BEHIND_NULL | Если функция завершается успешно, то младший байт параметра dwFlags (0) используется для заполнения неинициализированной части pszDest после символа завершающего нуля. |
STRSAFE_IGNORE_NULLS | Обрабатываются указатели пустой строки подобно пустым строкам ( TEXT ("")). Этот флажок полезен для эмуляции таких функций как lstrcpy. |
STRSAFE_FILL_ON_FAILURE | Если функция завершается ошибкой, младший байт dwFlags (0) используется, чтобы заполнить весь буфер pszDest, а буфер завершается символом конца строки ('\0'). В случае сбоя типа STRSAFE_E_INSUFFICIENT_BUFFER, любая обрезанная строка возвращается перезаписанной. |
STRSAFE_NULL_ON_FAILURE | Если функция завершается ошибкой, pszDest устанавливается в значение "пустая строка" ( TEXT ("")). В случае сбоя типа STRSAFE_E_INSUFFICIENT_BUFFER любая обрезанная строка перезаписыватся. |
STRSAFE_NO_TRUNCATION | Как и в случае с STRSAFE_NULL_ON_FAILURE, если функция завершается ошибкой, pszDest устанавливается в значение "пустая строка" ( TEXT ("")). В случае сбоя типа STRSAFE_E_INSUFFICIENT_BUFFER, любая обрезанная строка перезаписывается. |
Обратите внимание! на то, что функцией возвращается значение HRESULT в противоположность функции strcpy, которая возвращает указатель. Поэтому настоятельно рекомендуется, чтобы вы использовали макросы SUCCEEDED и FAILED для проверки возвращаемого значения этой функцией. |
Значение |
Предназначение |
S_OK | Исходные данные присутствовали, полностью скопированы без усечения, а итоговый результат целевого буфера завершен символом конца строки ('\0'). |
STRSAFE_E_INVALID_PARAMETER | Или параметр pszDest - NULL, когда имеются предоставленные исходные данные для копирования, или передан недопустимый флажок. |
STRSAFE_E_INSUFFICIENT_BUFFER | Операция копирования завершалась ошибкой из-за недостаточного места в буфере. В зависимости от значения dwFlags целевой буфер может содержать обрезанную, версию с нулевым символом в конце предполагаемого результата. В ситуациях, где усечение является приемлемым, это может не обязательно быть отмечено как условие сбоя. |
Функция StringCchCopyEx предусматривает дополнительную обработку для правильной работы буфера в Вашем коде. Недостаточная обработка буфера влечет за собой многие проблемы обеспечения безопасности, которые вызывают переполнение буфера. StringCchCopyEx всегда завершает символом конца строки ('\0') целевой буфер ненулевой длины.
Функция StringCchCopyEx может быть использована в своей общей форме, или в специальной типа StringCchCopyExA (для строк ANSI) или StringCchCopyExW (для строк Unicode). Форма использования определяется Вашими данными.
Тип строковых данных |
Строковый литерал |
Функция |
---|---|---|
char | "string" | StringCchCopyExA |
TCHAR | TEXT("string") | StringCchCopyEx |
WCHAR | L"string" | StringCchCopyExW |
Функция StringCchCopyEx и её варианты ANSI и Unicode заменяют эти функции:
Поведение становится неопределенным, если строки указанные при помощи параметров pszSrc и pszDest - перекрываются.
Ни pszSrc, ни pszDest не должны быть NULL, если не определяется флажок STRSAFE_IGNORE_NULLS, при котором в этом случае, оба могут быть NULL. Однако, ошибка из-за недостаточного места может все еще возвратиться даже при том, что игнорируются нулевые значения.
Обзор Строки, Функции, используемые строками, StringCbCopyEx, StringCchCopy
Размещение и совместимость StringCchCopyEx |
||
К | Windows XP | Да |
л | Windows 2000 Professional | Да |
и | Windows NT Workstation | Да версии 3.1 |
е | Windows Me | Да |
н | Windows 98 | Да |
т | Windows 95 | Да |
С | Windows Server 2003 | Да |
е | Windows 2000 Server | Да |
р | Windows NT Server | Да версии 3.1 |
в | ||
е | ||
р | ||
Используемая библиотека | strsafe.lib | |
Используемая DLL | - | |
Заголовочный файл | ||
- объявлено в | strsafe.h | |
- включено в | - | |
Unicode | Реализуются как версии Unicode и ANSI. | |
Замечания по платформе | Не имеется |