У меня есть .dll с функцией C++, которая принимает параметры const wchar16_t*
. Я пытаюсь импортировать и использовать его в C# со строкой, массивом символов и массивом символов с дополнительным символом '\ 0', но я не получил результата. Когда я проверяю его в исходной программе C++ в режиме отладки, в конце он имеет дополнительный символ «\ 0». Какой именно тип следует использовать?PInvoke вызов функции с параметрами wchar16_t
P.s. Я не уверен на 100%, что проблемы возникают из-за этих параметров. Я бы очень признателен и даю много очков, если кто-то любезно рассмотрит небольшие проекты I attach, иллюстрирующие проблему. Программа на C++ отлично работает (мы получаем ответ на запрос), но в проекте C# OnLoginResponseCallback никогда не срабатывает.
Что делать в C#
[DllImport("ActiveTickServerAPI.dll", CharSet = CharSet.Unicode, EntryPoint = "[email protected]@[email protected]@@[email protected]", 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 Docs:
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;
Возможно, http://stackoverflow.com/a/6089416/696034 даст вам ответ? –
не мое дело, ваша ссылка о параметре out. – Dork
Это может быть опечатка в сообщении, но нулевой терминатор равен \ 0, not/0 – pikzen