C++ CLI / TS3 клиент падает на плагин
Оооо... Я написал плагин, и весь плагин работает отлично. ТОЛЬКО ПРОБЛЕМА: мой клиент TS3 падает.
Чтобы дать контекст:
(Предупреждение: этот код просто плохо вставлен. На GitHub он вылетает в строках 270 и 285)
// Helper Function
String^ getChannelName(uint64 serverConnectionHandlerID, uint64 channelID) {
char* tmp;
if (ts3Functions.getChannelVariableAsString(serverConnectionHandlerID, channelID, CHANNEL_NAME, &tmp) == ERROR_ok) {
return marshal_as<String^>(tmp);
}
else
{
return "ERROR_GETTING_CHANNELNAME";
}
}
void assemble_a() {
List<String^>^ clients;
List<String^>^ channel;
// Some middlepart here, but I made sure it works as it should
// And the actual part where it is crashing
if (resChL == ERROR_ok) {
for (int i = 0; channelListPtr[i]; ++i) {
String^ a = getChannelName(schid, channelListPtr[i]);
const char* b = (const char*)(Marshal::StringToHGlobalAnsi(a)).ToPointer();
ts3Functions.logMessage(b, LogLevel_DEBUG, "DEBUG_VC", schid);
if (String::IsNullOrEmpty(a) == false) {
channel->Add(a); // It crashes RIGHT at this point
}
}
}
}
Поэтому я давно спрашиваю на форуме TS3, получаю много ответов, и никто не может сказать мне, почему он на самом деле дает сбой, и мне так и не удалось выяснить это самостоятельно.
Это на самом деле печатать название канала [*spacer0]t
но как только он добавляет его в список строк, происходит сбой. Бросает сообщение The thread has tried to write or read from a virtual address that it does not have the accesspermissions for.
Я серьезно понятия не имею, что делать, пытаясь исправить это в течение более 2 недель.
Для полного контекста: GitHub Sourcecode
Извините, если этот вопрос МОЖЕТ быть немного неуместным здесь (правда? Я не знаю...), но я действительно не знаю, что делать с этой проблемой больше...
РЕДАКТИРОВАТЬ: сообщение об ошибке от try/catch это:System.NullReferebceException: The Objectreference was not set to the Objectinstance, occured in tsapi.assembleGrammar()
1 ответ
List<String^>^ channel;
...
channel->Add(a);
channel
нулевой. Вам нужно инициализировать это чем-то, вероятно gcnew List<String^>()
, Я не уверен, почему вы получаете сообщение об отказе в доступе вместо NullReferenceException.
Другие вопросы
- Убедитесь, что вы правильно обрабатываете все неуправляемые строки. Например, делает
getChannelVariableAsString
требуется вызов, чтобы явно освободить буфер? Обязательно позвониFreeHGlobal
освободить память, котораяStringToHGlobalAnsi
выделено для вас.