我在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”。
答案 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短。