#c #winapi
#c #winapi
Вопрос:
У меня есть функция для записи файла в BSTR, но я не могу записать его в файл с включенной кодировкой? Вот моя функция, пожалуйста, исправьте для меня!
unsigned long Vnpt_WriteFile(const LPCTSTR pFilePath, const BYTE* pbData, const DWORD cbData)
{
DWORD numbytes = 0;
unsigned long rv = 0;
FILE* fileHandle;
HANDLE fh = CreateFile(pFilePath, FILE_WRITE_DATA,0,NULL,CREATE_ALWAYS,0,NULL);
if (fh == INVALID_HANDLE_VALUE){
rv = CKR_CREATE_FILE_ERROR;
return rv;
}
if(!WriteFile(fh, pbData, cbData, amp;numbytes, NULL)){
rv = CKR_WRITE_FILE_ERROR;
}
CloseHandle(fh);
return rv;
}
Комментарии:
1. Исправлен отступ для удобства чтения.
2. Где находится
BSTR
в этом примере кода?3. Если вы пишете на C , разве это не было бы намного проще в использовании
iostream
?
Ответ №1:
BSTR — это строки с широкими символами (wchar_t). У вас не должно возникнуть проблем с записью их в файл с использованием функций общего назначения как WriteFile
. Единственная проблема, с которой вы столкнетесь, это просмотр файла с помощью какого-либо текстового редактора. Чтобы решить эту проблему, вы должны поместить метку порядка байтов (BOM) в начале файла, прежде чем записывать фактическое содержимое. Это укажет содержимое файла в текстовый редактор. Обратите внимание, однако, что вы должны знать об этом при чтении содержимого файла — он будет содержать эту спецификацию перед текстом.
Вы можете сделать что-то в этом роде (не отмечено):
unsigned char BOM[2] = {0xFF, 0xFE};
WriteFile(fh, BOM, 2, amp;numbytes, NULL);
сразу после создания файла и перед записью содержимого BSTR.
Позднее дополнение, просто чтобы прояснить мое первое предложение: a BSTR
— это не совсем массив wchar_t
s, но ради записи его содержимого в файл можно рассматривать его как таковой. Подробнее об этом читайте Полное руководство Эрика по семантике BSTR.