Я хотел бы написать плагин для какого-то приложения Windows, и это должна быть DLL. Я бы очень хотел попробовать сделать это в миксе Red & Red/System. Но задав вопрос в чате Rebol&Red здесь, на SO, я получил неоднозначные ответы относительно того, возможно ли это в настоящее время как в Red, так и в Red/System, или только в Red/System. Каков окончательный ответ?
Можно ли написать Windows DLL красным цветом?
Ответы (1)
Да, это возможно. Вы можете проверить объявление в Red-Blog для 0.3.3
Прежде всего, вот небольшой фрагмент, описывающий процесс для Red/System:
Генерация общих библиотек
Год мы работали над созданием общей библиотеки, теперь она доступна в основной ветке. Были добавлены новые функции для поддержки генерации библиотек, такие как способ объявления экспортируемых символов и специальных функций обратного вызова при загрузке и освобождении библиотеки. Вот простой пример библиотеки Red/System:
Red/System [ File: %testlib.reds ] inc: func [n [integer!] return: [integer!]][n + 1] #export [inc]
Вы компилируете такую разделяемую библиотеку, используя новую опцию командной строки -dlib:
do/args %rsc.r "-dlib testlib.reds"
Имя выходного двоичного файла будет иметь суффикс для конкретной платформы (.dll, .so или .dylib).
Во-вторых, мне наконец удалось получить один простой скрипт Red для компиляции в .dll. Директива #export
должна находиться в Red/System контексте, как вы можете видеть в директиве #system-global
. Любая функция, которую вы имеете в Red, должна быть обернута оболочкой Red/System. Это можно сделать с помощью #call
, как показано ниже:
Red []
hello: does [print "hello"]
#system-global [
hellosystem: does [
#call [hello]
]
#export cdecl [hellosystem]
]
red.exe -dlib example.red
не удается с ошибкой Loading Error с id: 'cannot-open
и arg1: "/C/prog/nppScripts/nppScripts03red/extension.reds"
. Может ли он скомпилироваться без Rebol и extension.reds?
- person akavel; 23.12.2013
hello-system
в hellosystem
, потому что не совсем уверен, что имена с тире разрешены в DLL; он скомпилирован, но когда я пытаюсь открыть DLL, я получаю сообщение об ошибке: Failed to load testdll.dll: Invalid access to memory location.
- person akavel; 31.12.2013