【问题标题】:.DLL C++ function to C#.DLL C++ 函数到 C#
【发布时间】:2017-06-19 15:19:35
【问题描述】:

我在使用 C# 的 WPF 项目中使用 mpusbapi.dll。 在 C++ 中,函数原型是:

DWORD MPUSBWrite(HANDLE handle,         
             PVOID pData,           
             DWORD dwLen,           
             PDWORD pLength,        
             DWORD dwMilliseconds);  

而我在 C# 中的 p/invoke 是:

[DllImport("mpusbapi.dll")]
private static extern DWORD _MPUSBWrite(void* handle, void* pData, DWORD dwLen, DWORD* pLength, DWORD dwMilliseconds);

所以,因为我没有让我的所有项目都不安全,所以我想构建下一个发送数据的方法:

unsafe private void SendPacket(byte* SendData, UInt32 SendLength)
{
     uint SendDelay = 10;
     UInt32 SentDataLength;

     openPipes();
     MPUSBWrite(myOutPipe, &SendData, SendLength, &SentDataLength, SendDelay);
     closePipes();
}

但 Visual Studios 向我显示参数变量类型的错误。 “无法从 'byte**' 转换为 'system.IntPtr'”和“无法从 'uint*' 转换为 'system.IntPtr'”。 我是使用 C# 的新手,现在指针让我卡住了。我应该如何将 c++ 参数转换为 C#?谢谢!

编辑: 我没有注意到我已将 Pinvoke 更改为:

[DllImport("mpusbapi.dll", CallingConvention = CallingConvention.Cdecl)]
static extern UInt32 _MPUSBWrite(IntPtr handle,IntPtr pData, UInt32 dwLen,IntPtr pLength, UInt32 dwMilliseconds);

添加: 删除方法调用中的 & 并没有修复最后的错误,并添加了这个“使用未分配的局部变量 'SendDataLenght'”。

【问题讨论】:

  • 尝试删除方法调用中的&,例如_MPUSBWrite(myOutPipe, SendData, SendLength, SentDataLength, SendDelay); ...如果您还有其他错误,请将其添加到您的问题中。

标签: c# c++ pointers pinvoke


【解决方案1】:

我不认为任何这些都是不安全的并使用指针。对参数语义做一些基本假设,你可以使用这个声明:

[DllImport("mpusbapi.dll")]
private static extern uint _MPUSBWrite(
    IntPtr handle, 
    byte[] data, 
    uint dataLength, 
    out uint sentDataLength, 
    uint timeoutMS
);

我不知道调用约定应该是什么。您在问题中同时使用 stdcallcdecl。与其猜测,不如确切地找出答案。

【讨论】:

  • 我进行了更改,看起来好像可以正常工作,但后来出现异常“PInvokeStackImbalance”。
  • 嗯,这通常是因为调用约定是错误的。阅读我的最后一段。您必须确定调用约定并指定它。我不能从这里做到这一点。
  • 谢谢,伙计。我添加了调用约定 cdecl 并解决了异常。现在我正在测试程序,看看它是否有效
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-02-24
  • 2015-03-17
  • 2010-10-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-23
相关资源
最近更新 更多