Как записать BSTR в файл с кодировкой?

#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.