以下是什么是c#dll导入声明?

时间:2018-01-27 05:08:29

标签: c# c++ vb6 dllimport

我在c ++头文件中有以下功能:

__int16 __stdcall s_em4305_login (HANDLE m_hUSB, int DataRate, UCHAR * password);

当我运行VB equavelent时:

Private Declare Function RF_EM4305_Login Lib "SRF32.dll" Alias "s_em4305_login" (ByVal handle As Long, ByVal DataRate As Long, ByRef bytes As Byte) As Integer 

我将-1100作为值

返回

当我运行c#equavilent:

[DllImport("SRF32.dll", EntryPoint = "s_em4305_login")]
private static extern ushort RF_EM4305_Login(IntPtr handle, int DataRate,byte[] password);  

我得到了不同的价值。第3个参数很可能被宣布错误。有人可以协助将c ++声明转换为c#

更新

我添加了一些额外的声明

private static extern ushort RF_EM4305_Login(IntPtr handle,int DataRate,IntPtr password);
private static extern ushort RF_EM4305_Login(IntPtr handle,int DataRate,ref byte [] password);

通过所有3个c#声明,我得到了返回值“64436”。

1 个答案:

答案 0 :(得分:0)

如果你的无人代码将password视为以空值终止的ansi字符串,那么这两个应该都有效。

[DllImport("SRF32.dll", EntryPoint = "s_em4305_login", CharSet = CharSet.Ansi)]
private static extern short RF_EM4305_Login(IntPtr handle, int DataRate, string password);

[DllImport("SRF32.dll", EntryPoint = "s_em4305_login")]
private static extern short RF_EM4305_Login(IntPtr handle, int DataRate, [MarshalAs(UnmanagedType.LPStr)]string password);

你的C#声明也没错,因为ushort 64436在内存中等于-1100短。

相关问题