如何将C函数签名转换为C#并在本机DLL中调用该函数?

用户名
int __stdcall getProps( /* [ in ] */ void * context,
                        /* [ in ] */ const UINT32 index,
                        /* [ in ] */ WCHAR * const pwszFilterPath,
                        /* [ in, out ]*/ UINT32 * const pFilterPathSizeInCch,
                        /* [ in ]*/ WCHAR * const pwszFilterName,
                        /* [ in, out ] */ UINT32 * const pFilterNameSizeInCch );

对于签名以上的C函数,此C#签名正确吗?

[DllImport("myLib.dll", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Unicode)]
        public static extern int getProps( IntPtr context,
                                           uint index,
                                           [MarshalAs(UnmanagedType.LPWStr)]
                                           out StringBuilder pwszFilterPath,
                                           ref uint pFilterPathSizeInCch,
                                           [MarshalAs(UnmanagedType.LPWStr)]
                                           out StringBuilder pwszFilterName,
                                           ref uint pFilterNameSizeInCch );

这里有问题,我不知道是什么(我不知道C#)。有时,当我开始使用它时,我会在StringBuilder变量中收到ANSI字符串,并且它们应包含UNICODE字符。

想法是调用此函数两次。首先将pwszFilterPath和pwszFilterName设置为NULL,以便检索所需的大小,然后为这两个缓冲区分配内存,然后在第二次调用中检索值。我知道如何在C / C ++中做到这一点,但在C#中却不知道。

戴维·赫弗南

您必须outStringBuilder参数中删除关键字将纯StringBuilder参数编组为指向字符数组的指针。如果您希望接收本机代码NULL,请传递C#null

[DllImport("myLib.dll", CharSet = CharSet.Unicode)]
public static extern int getProps(
    IntPtr context,
    uint index,
    StringBuilder pwszFilterPath,
    ref uint pFilterPathSizeInCch,
    StringBuilder pwszFilterName,
    ref uint pFilterNameSizeInCch
);

调用模式如下:

  1. 传递nullStringBuilder参数以找出缓冲区大小。
  2. StringBuilder使用接收容量的构造函数重载分配实例。
  3. 通过StringBuilder实例再次调用该函数

也许像这样:

uint filterPathLength = 0;
uint filterNameLength
int retval = getProps(
    context,
    index,
    null,
    ref filterPathLength,
    null,
    ref filterNameLength
);
// check retval

StringBuilder filterPath = new StringBuilder(filterPathLength);
StringBuilder filterName = new StringBuilder(filterNameLength);
int retval = getProps(
    context,
    index,
    filterPath,
    ref filterPathLength,
    filterName,
    ref filterNameLength
);
// check retval

而且,您需要确保正确使用null终止符的长度约定。我无法判断您的函数是否返回包含空终止符的长度。


正如@Ben指出的那样,您的注释与文本描述不匹配。

/* [ in ] */ WCHAR * const pwszFilterPath

[in]应该表示数据正在流入函数中。在这种情况下,类型应为const WCHAR*但事实并非如此。这是一个out参数。因此,代码应显示为:

/* [ out ] */ WCHAR * const pwszFilterPath

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何将父代转换为子代以调用C#中的右函数

来自分类Dev

如何将C ++类转换为托管类并在其中调用纯虚函数?

来自分类Dev

如何将指针从C#传递到DLL中的本机函数?

来自分类Dev

如何将DLL函数调用/ DllImport从vb6转换为C#.NET

来自分类Dev

从C#调用C dll中的函数,该函数将某种类型的指针返回到函数指针

来自分类Dev

如何将整数从C#方法复制到本机C DLL函数

来自分类Dev

C ++-如何将函数转换为模板函数

来自分类Dev

无法从 C DLL 调用该函数

来自分类Dev

如何将此函数从C转换为C#?

来自分类Dev

将函数调用转换为Expression C#

来自分类Dev

如何将C ++ sscanf_s()函数转换为C#

来自分类Dev

如何从C#调用C ++ DLL函数

来自分类Dev

从C#调用Advapi32.dll本机EventWrite函数?

来自分类Dev

从C#调用Advapi32.dll本机EventWrite函数?

来自分类Dev

如何将Java“ Arrays.copyOfRange”函数转换为C#?

来自分类Dev

将 FORTRAN 函数转换为 C#

来自分类Dev

如何将普通函数转换为类中的函数?

来自分类Dev

C#在SQL Server中调用用户定义的标量函数,该函数将表类型作为其参数

来自分类Dev

从C#中的C ++ DLL P /调用DLL函数

来自分类Dev

C#中如何将Json转换为对象

来自分类Dev

在C ++中如何从不同的库调用具有相同签名的dll函数?

来自分类Dev

将C#函数转换为Delphi函数

来自分类Dev

如何将指针传递给函数并在函数C ++中动态分配内存

来自分类Dev

如何将转换转换为函数?

来自分类Dev

在 Python 中,如何将类/函数的调用转换为字符串?

来自分类Dev

如何访问C ++函数,该函数将指针作为来自C#的输入参数

来自分类Dev

如何将构造函数表达式放入数组中并在C#中使用它们?

来自分类Dev

从C ++ / CLI调用C#函数-将返回C#字符串转换为C字符串

来自分类Dev

如何将返回指针从C ++ dll函数返回到C#

Related 相关文章

  1. 1

    如何将父代转换为子代以调用C#中的右函数

  2. 2

    如何将C ++类转换为托管类并在其中调用纯虚函数?

  3. 3

    如何将指针从C#传递到DLL中的本机函数?

  4. 4

    如何将DLL函数调用/ DllImport从vb6转换为C#.NET

  5. 5

    从C#调用C dll中的函数,该函数将某种类型的指针返回到函数指针

  6. 6

    如何将整数从C#方法复制到本机C DLL函数

  7. 7

    C ++-如何将函数转换为模板函数

  8. 8

    无法从 C DLL 调用该函数

  9. 9

    如何将此函数从C转换为C#?

  10. 10

    将函数调用转换为Expression C#

  11. 11

    如何将C ++ sscanf_s()函数转换为C#

  12. 12

    如何从C#调用C ++ DLL函数

  13. 13

    从C#调用Advapi32.dll本机EventWrite函数?

  14. 14

    从C#调用Advapi32.dll本机EventWrite函数?

  15. 15

    如何将Java“ Arrays.copyOfRange”函数转换为C#?

  16. 16

    将 FORTRAN 函数转换为 C#

  17. 17

    如何将普通函数转换为类中的函数?

  18. 18

    C#在SQL Server中调用用户定义的标量函数,该函数将表类型作为其参数

  19. 19

    从C#中的C ++ DLL P /调用DLL函数

  20. 20

    C#中如何将Json转换为对象

  21. 21

    在C ++中如何从不同的库调用具有相同签名的dll函数?

  22. 22

    将C#函数转换为Delphi函数

  23. 23

    如何将指针传递给函数并在函数C ++中动态分配内存

  24. 24

    如何将转换转换为函数?

  25. 25

    在 Python 中,如何将类/函数的调用转换为字符串?

  26. 26

    如何访问C ++函数,该函数将指针作为来自C#的输入参数

  27. 27

    如何将构造函数表达式放入数组中并在C#中使用它们?

  28. 28

    从C ++ / CLI调用C#函数-将返回C#字符串转换为C字符串

  29. 29

    如何将返回指针从C ++ dll函数返回到C#

热门标签

归档