Здравствуйте, гость ( Вход | Регистрация )

> Плагины на C++, Пример плагина, обсуждение.
DarkMaster
сообщение 6.11.2013, 8:57
Сообщение #1


***********

Модератор UOPilot
Сообщений: 9.743
Регистрация: 2.12.2008
Группа: Супермодераторы
Наличность: 29659
Пользователь №: 11.279



Образец плагина на C++:
Файл .cpp 0.1.1
Подправлен тип указателя в параметрах функций плагина.
Код

#include <stdexcept>

using namespace std;

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

struct tParamStruct
{
    int unsigned* WindowHandle; // Handle of workWindow
    int unsigned* WindowPID; // pid of process of workWindow
    int unsigned Reserved;
    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 plagin, 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);
}

// Образец функции используемой в пилоте. Вернет значения переданные пилотом
// при иницализации dll и доступные для для дальнейших действий.
extern "C" __declspec(dllexport) void __stdcall Function1(tParamStruct *ParamStruct)
{
    sprintf_s(ParamStruct->Result,
        "%s" "%d" "%s" "%d" "%s" "%s" "%s" "%s",
        "Handle ", ParamStruct->WindowHandle,
        "; Pid ", ParamStruct->WindowPID,
        "; Parametr string ", ParamStruct->ParamString,
        "; Parametr string original ", ParamStruct->ParamStringOrig
        );
}

// Образец функции, возвращающей строку.
extern "C" __declspec(dllexport) void __stdcall Function2(tParamStruct *ParamStruct)
{
    strcpy_s(ParamStruct->Result, "Simple emty function");
}

extern "C" __declspec(dllexport) void __stdcall DonePlugin()
{
    delete[] InitStruct.FunctionNames;
}

Файл .def
Код
LIBRARY
EXPORTS
    InitPlugin
    DonePlugin
    Function1
    Function2


Архив.
Файл .cpp 0.1
Код

#include <stdexcept>

using namespace std;

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

struct tParamStruct
{
    int unsigned* WindowHandle; // Handle of workWindow
    int unsigned* WindowPID; // pid of process of workWindow
    int unsigned Reserved;
    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 plagin, free on unload


extern "C" __declspec(dllexport) unsigned long * __stdcall InitPlugin(int App, int Scr, double& Version)
// App: Application.Handle of UOPilot
// Scr: reserved
{
    // Количество полезных экспортируемых функций для сообщения пилоту
    // в зависимости от версии протокола обмена между пилотом и плагином.
    // Это НЕ версия самого пилота, а версия протокола обмена между пилотом и длл.
    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);
}

// Образец функции используемой в пилоте. Вернет значения переданные пилотом
// при иницализации dll и доступные для для дальнейших действий.
extern "C" __declspec(dllexport) bool __stdcall Function1(void *AdressPS)
{
    ParamStruct = static_cast<tParamStruct *>(AdressPS);
    sprintf_s(ParamStruct->Result,
        "%s" "%d" "%s" "%d" "%s" "%s" "%s" "%s",
        "Handle ", ParamStruct->WindowHandle,
        "; Pid ", ParamStruct->WindowPID,
        "; Parametr string ", ParamStruct->ParamString,
        "; Parametr string original ", ParamStruct->ParamStringOrig
        );
    return (1);
}

// Образец функции, возвращающей строку.
extern "C" __declspec(dllexport) void __stdcall Function2(void *AdressPS)
{
    ParamStruct = static_cast<tParamStruct *>(AdressPS);
    strcpy_s(ParamStruct->Result, "Simple emty function");
}

extern "C" __declspec(dllexport) void __stdcall DonePlugin()
{
    delete[] InitStruct.FunctionNames;
}


Сообщение отредактировал DarkMaster - 28.5.2015, 1:06


--------------------
Скрипты UOPilot под заказ.
Консультации по UOpilot 15$/час.
Услуги Lua разработчика (не пилот, проекты, постоянка)
Disсоrd:
Kov____
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения



Ответить в эту темуОткрыть новую тему
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 

- Текстовая версия | Версия для КПК Сейчас: 13.7.2025, 23:44
Designed by Nickostyle