PDA

Просмотр полной версии : [Вопрос] Написание плагина [C++]



BadPawn
21.02.2017, 09:45
Всем привет господа.

Ниже код, подскажите, как сделать ну хоть что-то?)) Прошу вас.


#include "dll.h"
#include <windows.h>
#include "SDK/amxplugin.cpp"
#include "SDK/amx/amx.h" // хоть и есть ссылка на этот плагин в plugin.h, но почему то работает лучше когда прописан сразу здесь
#include "SDK/plugin.h"

typedef DLLIMPORT void (*logprintf_t)(char* format, ...);
logprintf_t logprintf;

DLLIMPORT void **ppPluginData;

BOOL Copys(char indir[128],char outdir[128]);

extern DLLIMPORT void *pAMXFunctions;

static char *pcCreateAndFillStringFromCell(AMX *amx, cell params)
{
char *szDest;
int nLen;
cell *pString;
amx_GetAddr(amx,params,&pString);
amx_StrLen(pString, &nLen);
szDest = new char[nLen+1];
amx_GetString(szDest, pString, 0, UNLIMITED);
return szDest;
}
typedef DLLIMPORT struct assoc_array assoc_array;

PLUGIN_EXPORT DLLIMPORT unsigned int PLUGIN_CALL Supports()
{
return SUPPORTS_VERSION | SUPPORTS_AMX_NATIVES;
}
PLUGIN_EXPORT DLLIMPORT bool PLUGIN_CALL Load(void **ppData)
{
pAMXFunctions = ppData[PLUGIN_DATA_AMX_EXPORTS];
logprintf = (logprintf_t)ppData[PLUGIN_DATA_LOGPRINTF];
logprintf("Плагин загружен.");
return 1;
}

PLUGIN_EXPORT DLLIMPORT void PLUGIN_CALL Unload()
{
logprintf("Плагин не загружен.");
}

static cell AMX_NATIVE_CALL callback_helloworld(AMX *amx, cell *params)
{
logprintf("Привет мир.");
return 1;
}

AMX_NATIVE_INFO Natives[] =
{
{ "HelloWorld", callback_helloworld }

};

PLUGIN_EXPORT DLLIMPORT int PLUGIN_CALL AmxLoad(AMX *amx)
{
return amx_Register(amx, Natives, -1);
}

PLUGIN_EXPORT DLLIMPORT int PLUGIN_CALL AmxUnload(AMX *amx)
{
return AMX_ERR_NONE;
}




BOOL APIENTRY DllMain(HINSTANCE hInst, DWORD reason, LPVOID reserved)
{
switch (reason)
{
case DLL_PROCESS_ATTACH:
break;

case DLL_PROCESS_DETACH:
break;

case DLL_THREAD_ATTACH:
break;

case DLL_THREAD_DETACH:
break;
}
return TRUE;
}

vovandolg
21.02.2017, 12:58
а через какую прогу пытаешься это сделать?

BadPawn
21.02.2017, 14:40
Dev-c++, или наоборот) есть толк в использованном софте?

$continue$
21.02.2017, 17:16
Покажи корень проекта (скрином). А и ещё есть какой то профит в С++ использовать char?
Давно есть string, vector string.

BadPawn
21.02.2017, 17:54
$continue$, с++ не знаю совсем. решил попробовать. как бы такое мелкое начало. попробовать, что бы что-то работало короче)))


#ifndef _DLL_H_
#define _DLL_H_

#if BUILDING_DLL
#define MAIN_PLUGIN __declspec (dllexport)
#else
#define MAIN_PLUGIN __declspec (dllimport)
#endif

class MAIN_PLUGIN DllClass
{
public:

private:

};
#endif


#include "dll.h"
#include <windows.h>
#include "SDK/amxplugin.cpp"
#include "SDK/plugin.h"

typedef MAIN_PLUGIN void (*logprintf_t)(char* format, ...);
logprintf_t logprintf;

MAIN_PLUGIN void **ppPluginData;
extern MAIN_PLUGIN void *pAMXFunctions;

PLUGIN_EXPORT MAIN_PLUGIN unsigned int PLUGIN_CALL Supports()
{
return SUPPORTS_VERSION | SUPPORTS_AMX_NATIVES;
}
PLUGIN_EXPORT MAIN_PLUGIN bool PLUGIN_CALL Load(void **ppData)
{
pAMXFunctions = ppData[PLUGIN_DATA_AMX_EXPORTS];
logprintf = (logprintf_t)ppData[PLUGIN_DATA_LOGPRINTF];
logprintf("Плагин загружен.");
return 1;
}
PLUGIN_EXPORT MAIN_PLUGIN void PLUGIN_CALL Unload()
{
logprintf("Не загружен плагин.");
}

static cell AMX_NATIVE_CALL call_HelloWorld(AMX *amx, cell *params)
{
logprintf("HelloWorld - функция работает.");
return 1;
}
AMX_NATIVE_INFO Natives[] =
{
{ "HelloWorld", call_HelloWorld }
};
PLUGIN_EXPORT MAIN_PLUGIN int PLUGIN_CALL AmxLoad(AMX *amx)
{
return amx_Register(amx, Natives, -1);
}
PLUGIN_EXPORT MAIN_PLUGIN int PLUGIN_CALL AmxUnload(AMX *amx)
{
return AMX_ERR_NONE;
}

Всё, что есть. Из этих двух файлов генерируется .dll.

На C# для прог в принципе проблем нет в написании, а вот тут)))

$continue$
21.02.2017, 20:31
Я просил показать корень директории проекта, а не хейдер и сурс файл

Daniel_Cortez
21.02.2017, 21:35
А и ещё есть какой то профит в С++ использовать char?
Всему есть своё применение и свистоперделки из C++ не везде могут подойти. За примерами далеко ходить не нужно - можешь поискать на г-и командный процессор LifeCMD (ту версию, которая была написана на C++ с использованием std::string). Закончилось всё тем, что этот плагин работал в 2 раза медленнее, чем ZCMD.

$continue$
21.02.2017, 22:05
Ну как бы понятно, что char быстрей обрабатывает, но зачем писать на С++ в стиле Си?


Всему есть своё применение и свистоперделки из C++ не везде могут подойти. За примерами далеко ходить не нужно - можешь поискать на г-и командный процессор LifeCMD (ту версию, которая была написана на C++ с использованием std::string). Закончилось всё тем, что этот плагин работал в 2 раза медленнее, чем ZCMD.

BadPawn
22.02.2017, 04:24
static cell AMX_NATIVE_CALL addition (AMX *amx, cell *params)
{
int i = 3,
j = 5,
res = i + p;
return res;
}

И в моде:

printf ("%i", Add ());
Не понимаю цель использования, ибо в инклуде можно сделать тоже самое. Хз
Скорее всего чего-то не понимаю.

На C#, я заранее определяю какие функции требуются для написания софта, основные в плагин. Как-то проще)) а в чём ещё + без понятия. Мож кто расскажет?

- - - Добавлено - - -

Как сделать например ту же функцию Add но с параметрами, что бы в моде можно было указать теже переменные i и j?

vovandolg
22.02.2017, 08:02
Писал бы ты на вижаке я бы готовый пример скинул, с уже одной готовой функцией)

BadPawn
22.02.2017, 08:34
Скинь плз. Вот буквально минут 30 назад закончилась установка компонентов C++ на VS 2015. )

vovandolg
22.02.2017, 11:37
Думаю там не чего сложного ты не увидишь) пару изи функций для себя так делал тестил кое что
яндекс (https://yadi.sk/d/9LSYKep83ENAtS)