如何使用 dyn.load 获取加载到 R 中的 DLL 内的函数列表

jju*_*nju 5 c++ dll r

几年前,我编写了一个 dll,其中包含一些用于运行水文模型的函数。我忘记了 dll 内函数的名称和参数,不幸的是我忘记写一个好的文档文件。这些功能很复杂,所以我不想经历我可以使用的需要重写代码的替代方案。

我已将 dll 加载到 R 中,但正如我所说,我既不记得函数的名称,也不记得函数的语法。

如何列出函数以及如何查看函数的语法和我应该提供的参数?我知道参数是常见的模型输入,但老实说我不记得格式了。

此外,加载 dll 不会给出错误,但检查它是否已加载会给出FALSE。我怎样才能解决这个问题?

> x<-dyn.load("hbv_R64.dll")
> is.loaded("hbv_R64")
[1] FALSE
Run Code Online (Sandbox Code Playgroud)

Jos*_*ich 6

is.loaded("hbv_R64")TRUE仅当 hbv_R64.dll 具有名为 的符号(函数)时才会返回hbv_R64

您可以使用 获取注册名称(不一定是源代码中的名称)和接口的列表getDLLRegisteredRoutines

R> dlls <- getLoadedDLLs()
R> getDLLRegisteredRoutines(dlls$base)
                   .Call .Call.numParameters .Fortran .Fortran.numParameters
1      R_addTaskCallback                   4    dqrcf                      8
2 R_getTaskCallbackNames                   0   dqrdc2                      9
3   R_removeTaskCallback                   1   dqrqty                      7
4                                               dqrqy                      7
5                                              dqrrsd                      7
6                                               dqrxb                      7
7                                               dtrco                      6
Run Code Online (Sandbox Code Playgroud)

在你的情况下:

x <- dyn.load("hbv_R64.dll")
getDLLRegisteredRoutines(x)
Run Code Online (Sandbox Code Playgroud)

?getDLLRegisteredRoutines说:“将来,我们还将提供有关参数类型的信息。” 所以这些信息已经可以访问了,尽管我不确定如何访问。


小智 -1

最佳解决方案:使用反汇编。

用工具读取函数很容易(例如http://www.nirsoft.net/utils/dll_export_viewer.html),但很难找到参数。