【问题标题】:Is it possible to write a Windows DLL in Red?是否可以用 Red 编写 Windows DLL?
【发布时间】:2013-12-22 12:01:08
【问题描述】:

我想为一些 Windows 应用程序编写一个插件,它必须是一个 DLL。我真的很想尝试混合使用红色和红色/系统。但是在 SO 上询问 Rebol&Red 聊天室时,我得到了不同的回答,即目前是否可以在 Red 和 Red/System 中使用,或者仅在 Red/System 中可用。最终答案是什么?

【问题讨论】:

  • 为什么会投反对票?您能否发表评论,以便我可以改进或至少理解?我永远无法理解人们如何将第一票视为反对票而不关心评论以帮助作者。

标签: red red-system


【解决方案1】:

是的,这是可能的。您可以在Red-Blog for 0.3.3查看公告

首先,这里有一个简短的 sn-p 描述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 进行编译时没有成功,出现错误“加载错误”,id: 'cannot-openarg1: "/C/prog/nppScripts/nppScripts03red/extension.reds"。没有 Rebol 和 extension.reds 可以编译吗?
  • 如果参数和返回值不是整数或逻辑,则此方法不是那么简单。例如。您必须管理 c 字符串之间的转换!和一个字符串!在红色/系统代码中。
  • 这是有道理的。这是另一个很好的质量保证问题。谢谢!
  • 我将 hello-system 重命名为 hellosystem,因为我不太确定 DLL 中是否允许使用带有破折号的名称;它已编译,但当我尝试打开 DLL 时,出现错误:Failed to load testdll.dll: Invalid access to memory location.
猜你喜欢
  • 1970-01-01
  • 2019-01-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-25
  • 1970-01-01
  • 1970-01-01
  • 2012-01-25
相关资源
最近更新 更多