Код
sprintf_s(ParamStruct->Result,
"%u " "%u " "%s", &ResultStruct.RArray, ParamStruct->pResultStruct, ParamStruct->pResultStruct->RArray
);
Но как только я ствалю:
Код
ResultStruct.used = true;
пустота приходит.
Вверх
sprintf_s(ParamStruct->Result,
"%u " "%u " "%s", &ResultStruct.RArray, ParamStruct->pResultStruct, ParamStruct->pResultStruct->RArray
);
ResultStruct.used = true;
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;
}