【发布时间】:2025-12-01 11:05:01
【问题描述】:
我是一名 C/C++ 程序员,但我被要求更新一个用 C# 编写的程序以与设备通信。我的 C# 知识非常基础。
之前的版本完全是用C#写的,现在实际访问设备的API改成C了。我发现可以通过以下方式导入C函数API:
[DllImport("myapi.dll")]
public static extern int myfunct(
[MarshalAs(UnmanagedType.LPTStr)] string lpDeviceName,
IntPtr hpDevice);
在 C 中这个函数原型是:
int myFunct( LPTStr lpDeviceName, HANDLE* hpDevice );
其中 HANDLE 定义为:
typedef void *HANDLE;
但是,此功能无法按预期工作。其实在C#代码中调用我应该声明什么样的类型并传递给C#方法呢?
感谢您的帮助,对于任何愚蠢的问题,我们深表歉意。
【问题讨论】:
-
这是将 HANDLE 类型编组为 CLR 类型的正确方法。您的代码肯定有其他问题。你能告诉我们更多细节吗?
-
我同意维尔的观点。显示您从哪里获得
hpDevice您通过。一般来说,我希望它来自同一个库中的另一个函数。 -
我试过这个 public IntPtr myHANDLE = new IntPtr();
-
使用 IntPtr.Zero 作为默认值。不过,一般来说,您不会手动设置句柄 - 它们将由其他一些创建句柄的函数返回。除非这是设置句柄的函数,在这种情况下,将
ref IntPtr作为类型传递。 -
顺便说一句,我在测试 API 时让它在 C 上工作。我必须将它简单地声明为 HANDLE myHandle 并将其作为指针传递给函数,例如 myfunc(&myHandle)
标签: c# c++ dll interop void-pointers