lockResource () возвращает указатель, но на неизвестную структуру - PullRequest
2 голосов
/ 05 января 2012

Я работаю с Visual Studio 2003 в Windows 7.

Я пытаюсь встроить двоичный файл в консольное приложение Windows (c ++).Я добавил в скрипт ресурса (файл .rc) следующую строку:

SampleFile RCDATA  "c:\\sample.zip"

, а также добавил следующий код для доступа к файлу:

HRSRC hResource = FindResource(NULL, (LPCSTR)"SampleFile", RT_RCDATA);
LPVOID l = LockResource(hResource);

сейчас, hResource является допустимымhandle и LockResource также успешно выполняются, но указатель l указывает на некоторую структуру, возможно, заголовок, за которым следуют фактические данные zip-файла, который я пытался внедрить.Мне удалось заметить, что второй DWORD в указанном заголовке - это размер файла, и имя ресурса ("SampleFile") также появляется в заголовке, но не смог найти описание заголовка илинаименьший размер заголовка.

Ответы [ 3 ]

3 голосов
/ 06 января 2012

Как сказал Люк, вы пропускаете LoadResource() звонок в середине.

FindResource() по существу дает вам указатель / дескриптор заголовка ресурса, LoadResource() читает этот заголовок и дает вам значение, которое (на win32) указывает на сами данные, но раньше это был HGlobal, который можно перемещать в памяти. Затем вы заблокируете это место и получите указатель, используя LockResource().

Использование Win32 остается неизменным.

С MSDN

Не пытайтесь заблокировать ресурс, используя дескриптор, возвращаемый функцией FindResource или FindResourceEx. Такой дескриптор указывает на случайные данные.

Заголовок ресурса описывается в MSDN как вымышленная RESOURCEHEADER структура.

Этот ответ во многом взят из статьи Раймонда Чена о 16-битном управлении ресурсами

0 голосов
/ 08 января 2012

спасибо за помощь. На самом деле в моем коде был LoadResource, который терялся при копировании на сайт. Однако это связано с проблемой в моем коде. Код выглядел так: (на этот раз код Psuedo) HANDLE hFindHandle = FindResource (...); LoadResource (hFindHandle и модуль Handle); а потом LPVOID l = LockResource (hFindHandle);

Я не использовал возвращаемое значение из LoadResource, но продолжал использовать одно из FindResource, поэтому, хотя я и вызывал LoadResource, я не получил правильный указатель из LockResource.

0 голосов
/ 05 января 2012

У вас есть функция Api для получения размера ресурса SizeofResource .
Указатель указывает на начало файла, добавляемого в качестве ресурса (в вашем случае "c: \ sample.zip). ЕслиВы хотите, чтобы вы могли передать этот указатель в несжатую библиотеку или просто записать на диск.

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