【问题标题】:Calling function in C dll from C# which returns somekind of pointer to function pointer从 C# 调用 C dll 中的函数,它返回某种指向函数指针的指针
【发布时间】:2014-03-17 09:29:09
【问题描述】:

我有一个用 C 语言编写的 dll(无法访问源代码),我希望从 C# 调用它。如果 dll 使用简单类型,我会知道如何通过 PInvoke 处理它,但它不会:(

我试图调用的 dll 中的函数没有参数,所以问题是如何处理返回。我有一些示例 C 代码调用我喜欢在 C# 中重新创建的函数。据我了解,返回类型是指向函数指针的指针,这是正确的吗?该函数的返回值也应稍后传递回 dll 中的其他函数。

非常感谢任何帮助:)

/* C code */
typedef const struct simModel* (*ModelFunc)(void);
int ret=0;
HINSTANCE hInst = 0;
ModelFunc f=0;
const struct simModel*model =0;
if (!(hInst=LoadLibrary("model.dll"))) {
    return 1;
}
if (!(f=(ModelFunc)GetProcAddress(hInst,"simModelFunctions"))) {
    ret=1;
} else if (!(model=f())) {
    ret=1;
} else {
    /* Do stuff */
}

【问题讨论】:

    标签: c# c pointers dll


    【解决方案1】:

    simModelFunctions 函数返回指向simModel 结构(一种数据类型)的指针。

    您展示的代码通过动态查找函数地址来调用函数,这就是它具有函数指针的原因。该指针并非来自函数本身。

    在 C# 中,您可以简单地使用 model.dll 中的 DllImport 声明它。例如

    [DllImport("model.dll", CallingConvention = CallingConvention.Cdecl, ExactSpelling = true)]
    private static IntPtr simModelFunctions();
    

    然后,如果您需要检查结构的内容,则可以使用Marshal.PtrToStructure,或者只需将返回的IntPtr 传递给其他函数,而无需打扰内部的内容。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-04-29
      • 2012-02-02
      • 1970-01-01
      • 2015-08-07
      • 2013-04-10
      • 1970-01-01
      • 2017-10-03
      相关资源
      最近更新 更多