|
Вопросы по разработке. |
|
|
DarkMaster |
27.5.2016, 13:29
|
Модератор UOPilot
Сообщений: 9.573
Регистрация: 2.12.2008 Группа: Супермодераторы Наличность: 28548
Пользователь №: 11.279
|
Cockney, ты использовал новый интерфейс плагинов с передачей результата по указателю? У меня пустоту возвращает хоть убей. Причем структуру создаю, все назначаю, старый вариант по всей цепочке указателей значение считывает нормально: Код sprintf_s(ParamStruct->Result, "%u " "%u " "%s", &ResultStruct.RArray, ParamStruct->pResultStruct, ParamStruct->pResultStruct->RArray ); Но как только я ствалю: Код ResultStruct.used = true; пустота приходит. Сообщение отредактировал DarkMaster - 27.5.2016, 20:03
--------------------
Скрипты UOPilot под заказ. Консультации по UOpilot 15$/час. Услуги Lua разработчика (не пилот, проекты, постоянка) Disсоrd: Kov____
|
|
|
|
DarkMaster |
27.5.2016, 18:43
|
Модератор UOPilot
Сообщений: 9.573
Регистрация: 2.12.2008 Группа: Супермодераторы Наличность: 28548
Пользователь №: 11.279
|
С адресами я тоже тупил. Точнее я думал структуру создаст пилот, а мне ее надо только принять, соответственно писал сначала в молоко и понять ничего не мог. Но сейчас вроде как все нормально сделано... Код 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; }
Т.е. у тебя на практике реально новым методом данные возвращались? Сообщение отредактировал DarkMaster - 27.5.2016, 23:26
Прикрепленные файлы
socket.7z ( 13,13 килобайт )
Кол-во скачиваний: 1633
msvcp120d.7z ( 150,41 килобайт )
Кол-во скачиваний: 1465
msvcr120d.7z ( 446,96 килобайт )
Кол-во скачиваний: 1458
socket2.7z ( 13,14 килобайт )
Кол-во скачиваний: 1514
socket3.7z ( 13,35 килобайт )
Кол-во скачиваний: 1488
socket4.7z ( 13,35 килобайт )
Кол-во скачиваний: 1640
socket5.7z ( 13,37 килобайт )
Кол-во скачиваний: 1668
--------------------
Скрипты UOPilot под заказ. Консультации по UOpilot 15$/час. Услуги Lua разработчика (не пилот, проекты, постоянка) Disсоrd: Kov____
|
|
|
|
Cockney |
27.5.2016, 21:11
|
Master
Сообщений: 1.402
Регистрация: 22.6.2013 Группа: Пользователи Наличность: 21916
Пользователь №: 16.156
|
Код tResultStruct = packed record // Заполняется плагином. Память под строку выделяется и освобождается плагином. used : boolean; // Используется ли эта структура при возврате значения. = false RLength : Cardinal; // Размер данных. ТИП НЕ МЕНЯЮ = 0 RArray : Pchar; // Указатель на возвращаемую строку. = '' Reserved1 : Cardinal; Reserved2 : Cardinal; Reserved3 : Int64; Reserved4 : Int64; end; Код z : tResultStruct; //глобально в инит плагине : Код //заполним данные z.RArray := 'f'; z.RLength := Length(z.RArray);
вызов Код вызов
ParamStruct := AdressPS; //адрес структуры приведем к инт ParamStruct^.Reserved := Integer(@z); z.used := True; // return value not analized while, may be later Result := true; Код 21:13:07 4 (autosaved_4.txt, 1): f
|
|
|
|
TemTriss |
8.6.2016, 18:19
|
Neophyte
Сообщений: 13
Регистрация: 8.6.2016 Группа: Пользователи Наличность: 0
Пользователь №: 18.009
Возраст: 27
|
Цитата(DarkMaster @ 8.6.2016, 18:11) Это не решается плагином.
Может подскажите а есть ли другие варианты? P.s. сори за офтоп.
--------------------
Чай должен быть крепким как бункер, спрятался от всего, а утром очнулся в дурке!
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|