win32 / C ++ Вставить текстовый файл в ресурс - PullRequest
0 голосов
/ 16 марта 2020

Я пытаюсь встроить пользовательский TXT-файл в exe-файл win32, используя кодовые блоки (компилятор TDM-G CC) на машине win10 x64.

Используя метод, отвеченный In silico , в аналогичном вопросе переменная «буфер» показывает только первые 3 байта. Пример: файл Data.txt содержит: "HOLA MUNDO" (22 байта проверены в шестнадцатеричном редакторе)

Но когда я показываю переменную 'char * buffer' с помощью MessageBox (), он показывает только первые три байта DATA. txt: ÿþH

Вот мой код:

void LoadFileResource() {

char* data = NULL;
DWORD  rcSize = 0;

TCHAR  sResName[5]  = _T("#107"); // ID from resource.h file for DATA.txt
TCHAR  sRestype[8] = _T("DATAREG"); // custom typeID from .rc file for DATA.txt

HRSRC rc = ::FindResource(NULL, sResName, sRestype);

HGLOBAL rcData = ::LoadResource(NULL, rc);
rcSize = ::SizeofResource(NULL, rc); // Have value of 22, and DATA.txt have 22 bytes    
data = static_cast<const char*>(::LockResource(rcData));

char* buffer = new char[rcSize+1];
::memcpy(buffer, data, rcSize);
buffer[rcSize+1] = 0; // NULL terminator, I think here is 0 for very LAST position of buffer

MessageBox(NULL, buffer, NULL, MB_OK); // Only show 3 first bytes from DATA.txt

delete[] buffer;
}

Также проверены ресурсы, скомпилированные в окончательном EXE-файле, и содержимое DATA.txt есть там "HOLA MUNDO" .

Как правильно манипулировать / показывать содержимое данных / буфера ??

Обновление: Даже используя другой режим преобразования для данных , отбрасывая 'new char []' и 'memcpy ()':

data = (char*)(::LockResource(rcData));

LPBYTE sData = (LPBYTE)data;
LPTSTR sXml = (LPTSTR)sData;

DWORD  buffSize = strlen(sXml); // Result in 3, don't know why.
MessageBox(NULL, sXml, NULL, MB_OK); //Shows again only first 3 bytes of DATA.txt

Тот же результат ÿþH .

1 Ответ

1 голос
/ 20 марта 2020

Спасибо всем за ваши комментарии и ответы.

Я играл с моим кодом более подробно, а также искал некоторую информацию об ошибке. По-видимому, первые 2 байта в моем файле DATA.txt ( ÿþ ) указывают, что это тип кодирования UTF-16 (big endian) , открывающийся в note ++, который я вижу, это UCS-2 LE BOM тип кодировки. Наконец, изменив файл DATA.txt на кодировку UTF-8 (без спецификации), позвольте мне присвоить содержимое этого ресурса переменной и поиграть с ним в своем коде.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...