UoKit.com Форумы > Кликер > UO Pilot > Плагины и доп. ПО
Страницы: 1, 2, 3, 4, 5, 6
DarkMaster
Cockney, ты использовал новый интерфейс плагинов с передачей результата по указателю? У меня пустоту возвращает хоть убей. Причем структуру создаю, все назначаю, старый вариант по всей цепочке указателей значение считывает нормально:
Код
     sprintf_s(ParamStruct->Result,
        "%u     " "%u     " "%s", &ResultStruct.RArray, ParamStruct->pResultStruct, ParamStruct->pResultStruct->RArray
        );

Но как только я ствалю:
Код
ResultStruct.used = true;

пустота приходит.
Вверх
Cockney
Игрался. Было раз такое, но это я с адресами тупил. сяду за комп - напишу код.
Вверх
DarkMaster
С адресами я тоже тупил. Точнее я думал структуру создаст пилот, а мне ее надо только принять, соответственно писал сначала в молоко и понять ничего не мог. Но сейчас вроде как все нормально сделано...
Код
include <stdexcept>

using namespace std;

struct tInitStruct
{
    long unsigned FunctionCount;
    const char** FunctionNames;
};


struct tResultStruct // Заполняется плагином. Память под строку выделяется и освобождается плагином.
{
    bool used;   // Используется ли эта структура при возврате значения. = false
    unsigned int RLength;  // Размер данных.
    char *RArray;     // Указатель на возвращаемую строку.
    unsigned int Reserved1;
    unsigned int Reserved2;
    unsigned __int64 Reserved3;
    unsigned __int64 Reserved4;
};
tResultStruct ResultStruct;



struct tParamStruct
{
    int unsigned* WindowHandle; // Handle of workWindow
    int unsigned* WindowPID; // pid of process of workWindow
    tResultStruct *pResultStruct;
    char* ParamString; // string of parameters with substituted variables
    char* ParamStringOrig; // original string of parameters
    char Result[32767]; // array for returned values
};


tParamStruct *ParamStruct;       // init by UOPilot
static tInitStruct InitStruct;   // init by plugin, free on unload


extern "C" __declspec(dllexport) unsigned long * __stdcall InitPlugin(int App, int Scr, double& Version)
{
    // Количество полезных экспортируемых функций для сообщения пилоту
    // в зависимости от версии протокола обмена между пилотом и плагином.
    // Это НЕ версия самого пилота, а версия протокола обмена между пилотом и длл.
    if (Version >= 2.18)
    {
        InitStruct.FunctionCount = 2;
        InitStruct.FunctionNames = new const char*[InitStruct.FunctionCount];
        InitStruct.FunctionNames[0] = "Function1";
        InitStruct.FunctionNames[1] = "Function2";
    }
    else
    {
        InitStruct.FunctionCount = 0; // Выгурзит длл, т.к. функций для экспорта нет.
    }
    return (&InitStruct.FunctionCount);
}


static char message[] = "123\0";
// Образец функции возвращающей строку.
extern "C" __declspec(dllexport) void __stdcall Function2(tParamStruct *ParamStruct)
{
        // Так работает по старой схеме:
    ResultStruct.RArray = message;
    ResultStruct.RLength = 4;
    ParamStruct->pResultStruct = &ResultStruct;
    sprintf_s(ParamStruct->Result,
             "%u     " "%u     " "%s", &ResultStruct.RArray, ParamStruct->pResultStruct, ParamStruct->pResultStruct->RArray
             );

        // Вот так пустоту возвращает:
    ResultStruct.used = true;
    ResultStruct.RArray = message;
    ResultStruct.RLength = 4;
    ParamStruct->pResultStruct = &ResultStruct;
}



Т.е. у тебя на практике реально новым методом данные возвращались?
Вверх
Cockney
Да.

А если так ? я не знаю, есть ли разница, но....

ParamStruct->pResultStruct = int(&ResultStruct);

т.к. в ParamStruct адрес данных идет в reserved, который является cardinal(в сях наверно int, или аналог), а ты адрес суешь сразу.

Вроде по размеру как бы совпадает, но то адрес прямой, а то число, хотя хз как там в си.
Вверх
DarkMaster
reserved был заменен на tResultStruct *pResultStruct;
Т.е. там натуральный указатель.
Цитата
ParamStruct->pResultStruct = int(&ResultStruct);

Фишка в том, что указатель там присвоен и он корректный, т.к.:
ParamStruct->pResultStruct->RArray
Содержит корректные данные...
Вверх
Cockney
Он корректный, да, ты же знаешь, что он там находится, и считываешь с него. А вот пилот, думаю, не знает, и пытается ЧИСЛО привести к АДРЕСУ. А выходит, что он непонятные данные приводит к чему-то. Ну имхо. Попробуй с исходным reserved. и приведи адрес к инту. не упрощай с лету все.
Вверх
DarkMaster
дык адрес это и есть unsigned int. Он хранится как беззнаковое 4 байта, т.е. unsigned int. Запись указателя в инт на самом деле это не очень правильно. Т.е. компилятор скажет, что я не прав и нужно приведение, либо, как обычно и делается, сказать компилятору, что данные на самом деле нужного типа(int)pointer.
Кардинал это беззнаковый 4 байта?

Чет я в этой запаре уже пальцы заплетаются. Не крашит - пустоту возвращает.
Вверх
Cockney
Да.

Ты пробовал, как я писал?
Вверх
DarkMaster
Да, сейчас как раз сижу. Так же попробовал сделать ошибку записав адрес в знаковый инт - результат тот же.

Причем пустота возвращается какая-то странная. chrtohex пишет, что там вроде как пусто, но если сделать:
log $var
то в лог не будет выведена даже пустая строка.
Вверх
DarkMaster
Дай работающий пример. Чет у меня такое чувство, что там указатель как-то криво хранится...
Вверх
Invision Power Board © 2001-2024 Invision Power Services, Inc.
Version for Pocket PC © 2006-2024, IPBest Studio.