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 выделено для вас.
Другие вопросы по тегам