VC ++ ресурсы в статической библиотеке

Для Swift 2.0 вы можете поместить этот код в viewDidLoad, и он будет работать как прелесть.

if #available(iOS 9.0, *) {
    let item = yourTextView.inputAssistantItem
    item.leadingBarButtonGroups = []
    item.trailingBarButtonGroups = []
} else {
    // Fallback on earlier versions
}

В Swift 3.0 и 4.0

youtTextField.inputAssistantItem.leadingBarButtonGroups.removeAll()
yourTextField.inputAssistantItem.trailingBarButtonGroups.removeAll()

Однако лучший способ использовать это для подкласса поля UIText и использовать вышеуказанный код в фазе init (). Или создать расширение Вместо того, чтобы использовать его в viewDidLoad для каждого текстового поля.

36
задан sharkin 10 February 2009 в 08:39
поделиться

5 ответов

Это может быть сделано, но это довольно болезненно: Вы не можете сделать этого путем простого соединения со статической библиотекой.

Рассматривают это: ресурсы встраиваются в EXE или DLL. Когда некоторый код в статических вызовах библиотеки (например). LoadIcon, это получит ресурсы от EXE или DLL, с которым это связано.

Так, если Ваша статическая библиотека требует, чтобы ресурсы были доступны, у Вас есть несколько опций:

  1. Вы можете сделать, чтобы библиотека создала их на лету и затем использовала (например). CreateDialogIndirect. Посмотрите, что Raymond Chen "Создает диалоговый шаблон во времени выполнения" .
  2. у Вас могут быть они встроенный в библиотеку как простые массивы (т.е.). char my_dialog_resource[] = { .... };, и затем используют (например). CreateDialogIndirect. Необходимо будет, вероятно, найти (или запись) утилиту, которая преобразовывает от .RES файлы к .CPP файлы.
  3. можно поставить Библиотечный файл со сценарием ресурса (.RC файл) и соответствующий заголовочный файл. Вы затем #include их как релевантный. Необходимо будет зарезервировать диапазон идентификаторов ресурса для LIB для использования, так, чтобы они не сталкивались с теми из основного EXE или DLL. Это - то, что делает MFC при использовании в качестве статической библиотеки. Или можно использовать идентификаторы строкового ресурса (это не работает на STRINGTABLE ресурсы).
  4. Ваша статическая библиотека может поставить с отдельным ресурсом DLL.
24
ответ дан Roger Lipscombe 10 October 2019 в 10:05
поделиться

Я не думаю так. Статическая библиотека не имеет своего собственного HINSTANCE. Это - код, выполняется в контексте DLL или EXE, который связывает его. Вот почему все ресурсы, которые Вы попытаетесь загрузить из кода статической библиотеки, будут иметь то включение DLL/EXE.

я сделал такое повторное использование ресурсов с DLL, хотя, насколько оно имеет свое собственное адресное пространство, и можно назвать LoadResource с HINSTANCE DLL.

1
ответ дан Ivan Krechetov 10 October 2019 в 10:05
поделиться

Рекомендуемый путь состоит в том, чтобы предоставить dll ресурсы вместе с Вашей библиотекой.

0
ответ дан Mihai Nita 10 October 2019 в 10:05
поделиться

Я только что прошел через это с компилятором MS Visual Studio. Мы конвертировали некоторые устаревшие проекты из DLL в статические библиотеки. В некоторые из этих DLL встроены диалоговые или строковые ресурсы. Мне удалось скомпилировать сценарии .RC для этих библиотек DLL в наше основное приложение, включив их в файл сценария RC основного приложения с помощью механизма «TEXTINCLUDE». Я нашел, что проще всего сделать это, отредактировав файл RC напрямую, но Visual Studio также предоставляет немного более «волшебный» механизм. Реализация в других компиляторах, скорее всего, отличается.


Для непосредственного управления основным сценарием RC:

.1. В разделе «2 TEXTINCLUDE» включите файл заголовка, который определяет идентификаторы ресурсов для вашей библиотеки. Синтаксис

2 TEXTINCLUDE 
BEGIN
    "#include ""my_first_lib_header.h""\r\n"
    "#include ""my_second_lib_header.h""\0" 
END

.2. В разделе «3 TEXTINCLUDE» включите сценарий RC из своей библиотеки.

3 TEXTINCLUDE
BEGIN
    "#include ""my_first_library.rc""\r\n"
    "#include ""my_second_library.rc""\0"
END

Шаги 3 и 4 должны выполняться автоматически, но я обнаружил, что более надежно просто ввести их самостоятельно, а не полагаться на компилятор сценария ресурсов Microsoft забота о вещах.

.3. Добавьте файл заголовка с определениями ресурсов библиотеки в список символов только для чтения. Этот список обычно находится в верхней части файла.

#define APSTUDIO_READONLY_SYMBOLS
#include "my_first_lib_header.h"
#include "my_second_lib_header.h"
#undef APSTUDIO_READONLY_SYMBOLS

.4. Включите сценарий RC вашей библиотеки в раздел APSTUDIO_INVOKED. Обычно это находится в нижней части файла.

#ifndef APSTUDIO_INVOKED
#include "my_first_library.rc"
#include "my_second_library.rc"
#endif 

Вы также можете сделать все это автоматически через IDE Visual Studio, но я обнаружил, что это не всегда применяется, когда я ожидал.

  1. Откройте «Просмотр ресурсов» "в Visual Studio.
  2. Щелкните правой кнопкой мыши файл ресурсов основного приложения и выберите" Ресурс включает ... "в контекстном меню.
  3. В поле" Директивы символов только для чтения "добавьте включаемый операторы для файлов .h, которые определяют идентификаторы ресурсов для ваших библиотек.
  4. В поле с надписью «Директивы времени компиляции» добавьте операторы включения для сценария .rc вашей библиотеки.
  5. Нажмите кнопку ОК. Вы также можете вручную запустить компиляцию сценария RC, чтобы убедиться, что это произойдет.

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

Чтобы добавить дополнительный путь включения:

  1. Откройте диалоговое окно свойств для вашего основного приложения.
  2. Выберите «Свойства конфигурации / Ресурсы / Общие» на левой навигационной панели.
  3. В списке свойств введите любые подходящие пути рядом с «Дополнительные каталоги включения».
10
ответ дан 27 November 2019 в 05:27
поделиться

Единственное, что вам нужно сделать для использования ресурсов (изображений, диалогов и т. Д.) В статической библиотеке в Visual C ++ (2008), - это включить связанную статическую библиотеку .res файл в вашем проекте. Это можно сделать в «Настройки проекта / Компоновщик / Вход / Дополнительные зависимости».

В этом решении ресурсы статической библиотеки упаковываются в .exe, поэтому вам не нужна дополнительная DLL. К сожалению, Visual Studio не включает файл .res автоматически, как это делается для файла .lib (при использовании функции «зависимости проекта»), но я думаю, что этот небольшой дополнительный шаг приемлем.

Я искал очень долго для этого решения, и теперь меня удивляет, что это так просто. Проблема только в том, что это совершенно недокументировано.

57
ответ дан 27 November 2019 в 05:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: