получение строк через взаимодействие
У меня проблемы с получением строки из некоторого кода C, который я написал.
Сначала некоторая нереализованная справочная информация: я хотел бы получить читаемую пользователем строку для TAPI TSP из TAPI API. Я реализовал полу работоспособное решение TAPI, основанное на сопоставлении имен драйверов с сохраненными строками, но вместо этого я хотел бы изменить это на работу с постоянными идентификаторами строк, поскольку у одного из наших клиентов есть УАТС (Alcatel), которая отказывается работать любым другим способом. ,
В C я определяю функцию в моем заголовочном файле как:
__declspec(dllexport) void GetDeviceName(long DeviceId, wchar_t* DeviceName);
Функция написана так:
__declspec(dllexport) void GetDeviceName(long DeviceId, wchar_t* DeviceName)
{
//tapi code here...
//copy the string to DeviceName
wcscpy(DeviceName, (wchar_t*)((char *)devCaps + devCaps->dwLineNameOffset));
}
Как указано выше, это в конечном итоге сделает что-то полезное, но сейчас я буду рад, если abc будет помещен в мой wchar_t * / StringBuilder, и я могу видеть это в C #.
В C # я определяю функцию как:
[DllImport("SBW.Tapi.TapiInterop.dll", CharSet = CharSet.Auto)]
static extern void GetDeviceName(long DeviceId, StringBuilder DeviceName);
Я определяю DeviceName как StringBuilder, потому что строка неизменна, и я хочу, чтобы DeviceName был установлен в C (Это рекомендуется MS). Я также установил тип возвращаемого значенияvoid
на тонкую надежду, что это также влияет на что-то (см.это полу полезная моно статья для частичного псевдонаучного объяснения).
И назовите это так:
StringBuilder name = new StringBuilder();
name.EnsureCapacity(100);
long n = 0;
GetDeviceName(n, name);
Я присоединяю мой отладчик к работающему процессу, устанавливаю точку останова и замечаю в коде C, что каким-то образом StringBuilder извращается и предоставляется неуправляемому коду в виде нулевого указателя.
AccessViolationException впоследствии генерируется в C #.
Что пошло не так?
удаление длинного параметра помогает. Я могу добавить «abc» к моему параметру DeviceName в C. Однако я хочу эту длинную переменную! Что я делаю не так или расстраиваюсь, чтобы вызвать сбой при наличии этого длинного параметра?