Жесткое кодирование ресурсов в приложении - PullRequest
3 голосов
/ 10 июня 2010

У меня есть некоторый код, который показывает простое диалоговое окно и обрабатывает действия пользователя (написанный с использованием простого WinAPI).

// Display dialog and handle user action
LRESULT choice = DialogBoxParam(NULL, MAKEINTRESOURCE(AP_IDD_DIALOG), NULL, (DLGPROC)DialogCallback, NULL);

Есть ли способ жесткий код файл ресурса dialog.rc, который используется для построения диалога? (Я хотел бы избавиться от .rcфайлы, и я почти уверен, что есть способ, но я не знаю, что это такое:)

Редактировать

Кроме того, кто-то естькакие-нибудь идеи по преобразованию существующих .rc файлов в жестко закодированные ресурсы?Это возможно?

Ответы [ 5 ]

3 голосов
/ 10 июня 2010

*. Rc (ресурсы) файлы являются исходным кодом, они скомпилированы с помощью компилятора ресурсов и связаны с вашим объектом (.exe / .dll)

Вам не нужно отправлять файл ресурсов или иметь его в своем приложении для запуска.

Если вы хотите перейти к программно определенным окнам, а не к шаблонам, то вам, возможно, стоит взглянуть на QT / wxWidgets. Но это большая часть накладных расходов на 1 диалог!

2 голосов
/ 10 июня 2010

Я удивлен, что не смог найти существующее приложение для такого рода вещей, достаточно хитов на Google, когда люди пытаются это сделать.

Хорошо, значит, DLGTEMPLATE - это блок данных переменной длины, обычно вы позволяете диалоговой функции извлекать его из пакета ресурсов, но вместо этого вы хотите сохранить его в своей программе.

Вам нужно изменить статическую библиотеку, чтобы иметь новую функцию для декодирования некоторого 'blob' обратно в dlgtemplate, и вам нужно сгенерировать BLOB-объект. (или добавьте блоб в ваш код без декодирования, о котором я не хочу сейчас думать)

Следующий код предоставит вам данные DLGTemplate, которые вам нужно вставить в ваше приложение. (вырезано из более крупного проекта)

HGLOBAL LoadResourceImpl(wchar_t *resource, wchar_t *type)
{
    HRSRC handle = FindResource(hInstance, resource,type);
    if (handle)
    {
        HGLOBAL hResource = LoadResource(hInstance, handle);
        if (hResource)
            return LockResource(hResource);  
    }
    return 0;
}

DLGTEMPLATE * LoadDialog(wchar_t *resource)
{
    return (DLGTEMPLATE *) LoadResourceImpl(resource,RT_DIALOG);
}

DLGTEMPLATE * LoadDialog(int resource)
{
    return (DLGTEMPLATE *) LoadResourceImpl(MAKEINTRESOURCE(resource),RT_DIALOG);
}

Создайте приложение, включающее ваш ресурс - используйте соответствующий LoadDialog для получения данных.

Теперь "выпишите" этот шарик в формате, который будет включен в ваше приложение - Шаг 1 - выясните, сколько данных имеется, пройдя структуру, чтобы найти общий размер, включая все элементы управления (счетчик элементов находится в DLGTEMPLATE :: cdit)

шаг 2 - преобразовать данные в то, что вы можете скомпилировать в ваш код - например, HEX

Добавьте в свою статическую библиотеку новый метод 'HEX' для DLGTEMPLATE и шестнадцатеричную строку, которую вы создали с помощью другого приложения.

2 голосов
/ 10 июня 2010

DialogBoxParamIndirect может использоваться вместо.Он принимает в качестве параметра шаблон диалога.В блоге Рэймонда Чена есть пример построения диалогового окна во время выполнения, а не из ресурса с использованием DialogBox * Indirect API's.

Per MSDN , ресурсы диалогового окнав основном состоит из структур DLGTEMPLATE и DLGITEMTEMPLATE.Таким образом, вы должны иметь возможность использовать API ресурсов (FindResource, LoadResource и LockResource), чтобы получить доступ к базовым битам существующего диалогового ресурса и внедрить его в свой код.

Обратите внимание, что это намного большебольно, чем с помощью файла .rc.Гораздо сложнее вносить изменения в свой макет, а также гораздо менее локализуемо, поскольку для локализации теперь потребуется изменение кода для обновления шаблона в коде.

1 голос
/ 19 апреля 2012

Можем ли мы жестко закодировать файл .res в программу?

  1. компилятор ресурсов преобразует .rc в .res
  2. , используя инструмент шестнадцатеричного дампа (например, winhex) дляпреобразовать .res в байтовый массив (представленный в исходном коде C).
  3. добавить файл исходного кода в проект и скомпилировать в исполняемый файл.
  4. найти позицию ресурса диалога из массива ииспользовать DialogBoxIndirect.
0 голосов
/ 10 июня 2010

Если это простой диалог, зачем вообще использовать DLGTEMPLATE?

Ничто не мешает вам просто сделать :: CreateWindow'ом эти элементы управления напрямую.Если это простой диалог с 2-3 кнопками и парой текстовых полей, просто вызовите :: CreateWindow, передав класс окна любого используемого вами общего элемента управления.

По сути, это то, что делают функции DialogXxxxxтем не мение.DLGTEMPLATE - это удобство для декларативного размещения ваших форм, а также для того, чтобы шаблон соответствовал соответствующим вызовам CreateWindow и т. Д.

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