Можно ли написать Windows DLL красным цветом?

Я хотел бы написать плагин для какого-то приложения Windows, и это должна быть DLL. Я бы очень хотел попробовать сделать это в миксе Red & Red/System. Но задав вопрос в чате Rebol&Red здесь, на SO, я получил неоднозначные ответы относительно того, возможно ли это в настоящее время как в Red, так и в Red/System, или только в Red/System. Каков окончательный ответ?


person akavel    schedule 22.12.2013    source источник
comment
Почему, почему минус? Не могли бы вы прокомментировать, чтобы я мог улучшить или хотя бы понять? Я никогда не могу понять, как люди могут просто отдать первый голос как отрицательный и не заботиться о комментариях, чтобы помочь автору.   -  person akavel    schedule 22.12.2013


Ответы (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]
]
person kealist    schedule 22.12.2013
comment
добавил еще один пример - person kealist; 22.12.2013
comment
Образец Red/System работает, но мне уже сказали об этом в чате, когда я пытался объяснить. Другой образец при попытке скомпилировать с 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
comment
Этот метод не так прост, если аргументы и возвращаемые значения не являются целочисленными или логическими. Например. вы должны управлять преобразованием между c-строкой! и шнурок! в красном/системном коде. - person Peter W A Wood; 23.12.2013
comment
Это имеет смысл. Это еще один хороший вопрос QA. Благодарю вас! - person kealist; 23.12.2013
comment
Я переименовал hello-system в hellosystem, потому что не совсем уверен, что имена с тире разрешены в DLL; он скомпилирован, но когда я пытаюсь открыть DLL, я получаю сообщение об ошибке: Failed to load testdll.dll: Invalid access to memory location. - person akavel; 31.12.2013
comment
Оказывается, оператор печати может не выводиться в нужное место в Windows. Я успешно вызвал функцию из dll в rebol, но не получил вывода. Не уверен в недопустимом доступе из Ruby. Я путешествовал, но постараюсь получить рабочий пример, который возвращает вам значение, когда я вернусь домой. Вы можете посмотреть, как получить значение из CALL здесь static. red-lang.org/red-system-specs.html#section-15.8 - person kealist; 31.12.2013
comment
Если бы кто-то более знающий ответил, было бы лучше. - person kealist; 31.12.2013
comment
Я спросил в списке рассылки Red, и мне сказали попробовать загрузить DLL с C, и это сработало! Итак, большое спасибо за помощь, @kealist! Хотя, похоже, действительно происходит что-то подозрительное, если у нас обоих возникают проблемы с языками, отличными от C (у меня были проблемы при загрузке с Go). - person akavel; 02.01.2014