【问题标题】:Dynamically load user32.dll from R & call external function从 R 动态加载 user32.dll 并调用外部函数
【发布时间】:2018-08-26 10:24:44
【问题描述】:

我尝试在 R Session 中访问 user32.dll 函数。我使用了代码:

dyn.load("c://windows//system32//user32.dll")
.External("MessageBeep", 0L)

但是 R 会话崩溃了。根据文档,.External 旨在在 R 包创建期间使用。但是,没有禁止使用它,如上所示。

我使用的是 Windows 8 和 RStudio (1.1.453) / R (3.5.0)。您能否建议一种从 R 会话中调用外部 Windows 函数的正确方法?

【问题讨论】:

  • 你在哪里指定调用约定为stdcall?我的猜测是你不能也需要创建一个包装 dll。
  • 据我所知,应该在编译期间指定调用约定。我应该看看 1) 编译一些包或 2) 使用一些外部进程来访问所需的 dll(类似于 VBA)?
  • 该函数的调用约定是 stdcall。我不确定 R 是否可以调用 stdcall 函数。我认为它总是使用 cdecl。 VBA 不是您所需要的。您实际上要调用哪些函数?
  • 感谢您的提示,我在cdecl & stdcall 上找到了 SO 帖子,并更彻底地尝试阅读 R 包创建文档。我正在尝试从任何 dll 函数调用任何函数。用于学术目的。

标签: r dllimport


【解决方案1】:

阿尔乔姆,

您正在访问 Win32 C API,因此您可以加载 user32.dll,然后使用 Foreign {base} .C() 调用也可以访问 Window32 MessageBeep 函数。

示例代码

dyn.load("c://windows//system32//user32.dll")
.C("MessageBeep")

运行时输出

> dyn.load("c://windows//system32//user32.dll")
> .C("MessageBeep")
list()
> 

您应该会听到 Windows 消息“哔”——唉,我还没有弄清楚如何在解决方案中包含声音(笑)。我希望以上内容有助于解决您的问题。

注意:我还建议你看看Rcpp 包,我是一个忠实的粉丝。

【讨论】:

    猜你喜欢
    • 2020-08-26
    • 1970-01-01
    • 2012-01-31
    • 2012-10-14
    • 2022-10-07
    • 1970-01-01
    • 2014-12-29
    • 2021-10-18
    • 2020-10-09
    相关资源
    最近更新 更多