c#中的typedef void*替换项

本文关键字:替换 void 中的 typedef | 更新日期: 2023-09-27 18:26:10

我使用的是DLL运行时,它是用C语言编译成C#的。我看到了下面的声明。

 typedef void *JCCP_PROPERTY_HANDLE;

在功能上,它被用作:

JCCP_RESULT  __JCCP_FUNCTION__ jccpGetProperty(
    JCCP_HANDLE hjccp,
    const char *name,
    JCCP_PROPERTY_HANDLE *phproperty);

现在我想在C#代码中调用jccpGetProperty()方法。有人能告诉我如何将第三个参数(JCCP_PROPERTYHANDLE*phproperty)传递给C#中的函数吗。

我尝试了以下代码,但没有工作。

外部方法:

 [DllImport(DLL_NAME, EntryPoint = "_jccpGetProperty", CallingConvention = CallingConvention.Cdecl)]
 public static extern IntPtr jccpGetProperty(IntPtr hjccp, string name, ref IntPtr JCCP_PROPERTY_HANDLE);

用法

IntPtr handle = IntPtr.Zero;
string tag = "server.version";
var result = jccpGetProperty(hjccp, tag, ref handle);

有人能帮我吗?

c#中的typedef void*替换项

IntPtrvoid*的正确类型映射。本机类型void*通常用于不透明指针,并映射到C#中的IntPtr

p/invoke声明中我们可以验证的部分是正确的。无法验证的部分是:

  • 呼叫约定。你相信是cdecl,但我们无法核实
  • 返回类型。你相信它是指针大小的。我们再次无法检查。我的猜测是,32位整数intuint更有可能。这将对64位进程产生影响
  • 传递给函数的值。函数的声明完全有可能是正确的,但您传递的是无效值

因为您只显示了部分代码和详细信息,所以很难说更多。您必须验证程序中我们无法验证的所有部分。

我建议你从处理C或C++代码开始,并对其进行翻译,寻找该代码和C#翻译之间行为的第一个偏差点。