【发布时间】:2016-02-05 10:51:49
【问题描述】:
我有一个带有 C++ 函数的 .dll,它采用 const wchar16_t* 参数。
我正在尝试使用字符串、char 数组和带有附加 '\0' char 的 char 数组在 c# 中导入和使用它,但我没有得到任何结果。
当我在调试模式下在原始 c++ 程序中检查它时,它最后有额外的 '\0' 字符。我应该使用什么确切类型?
附:我不能 100% 确定这些参数会出现问题。 如果有人可以查看我attach 说明问题的小项目,我将非常感激并给予很多积分。 C++ 程序工作正常(我们得到登录响应),但在 c# 项目中 OnLoginResponseCallback 永远不会触发。
我在 C# 中所做的事情
[DllImport("ActiveTickServerAPI.dll", CharSet = CharSet.Unicode, EntryPoint = "?ATCreateLoginRequest@@YA_K_KPB_W1P6AX00PAU_ATLOGIN_RESPONSE@@@Z@Z", ExactSpelling = true, CallingConvention = CallingConvention.Cdecl)]
private static extern ulong ATCreateLoginRequest(ulong sessionId, string user, string pwd, ATLoginResponseCallback onLoginResponse);
public delegate void ATLoginResponseCallback(ulong hSession, ulong hRequest, ATLOGINRESPONSE response);
public delegate void ATRequestTimeoutCallback(ulong origRequest);
static void Main(string[] args)
{
lastRequest = ATCreateLoginRequest(hSession, userId, pw, OnLoginResponseCallback);
bool rc = ATSendRequest(hSession, lastRequest, 3000, OnRequestTimeoutCallback);
}
static void OnLoginResponseCallback(ulong hSession, ulong hRequest, ATLOGINRESPONSE response)
{
Console.WriteLine("!THIS SHOULD FIRE, but fire only timeout callback");
}
[StructLayout(LayoutKind.Sequential)]
public struct ATLOGINRESPONSE
{
public byte loginResponse;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 255)]
public byte[] permissions;
public ATTIME serverTime;
}
[StructLayout(LayoutKind.Sequential)]
public struct ATTIME
{
public ushort year;
public ushort month;
public ushort dayOfWeek;
public ushort day;
public ushort hour;
public ushort minute;
public ushort second;
public ushort milliseconds;
}
在 c++ 中它是有效的(获取登录响应)。这是来自 api 文档的功能描述:
ACTIVETICKSERVERAPI_API uint64_t ATCreateLoginRequest ( uint64_t session,
const wchar16_t * userid,
const wchar16_t * password,
ATLoginResponseCallback pCallback
)
来自 c++ 的工作结构
typedef struct _ATLOGIN_RESPONSE
{
ATLoginResponseType loginResponse;
uint8_t permissions[255];
ATTIME serverTime;
} ATLOGIN_RESPONSE, *LPATLOGIN_RESPONSE;
typedef struct _ATTIME
{
uint16_t year;
uint16_t month;
uint16_t dayOfWeek;
uint16_t day;
uint16_t hour;
uint16_t minute;
uint16_t second;
uint16_t milliseconds;
} ATTIME, *LPATTIME;
【问题讨论】:
-
不是我的情况,你关于 out 参数的链接。
-
这可能是帖子中的拼写错误,但空终止符是\0,而不是/0
-
是的,谢谢
-
请在问题中发布minimal reproducible example。我敢肯定,这很容易回答,但谁想下载外部项目?