Кибор » Кибор - Интегрированная среда разработки ботов » О программе Кибор » Версия 4.13 Подключение своих DLL. Использование WinAPI функции в скрипте с стандартных библиотек

Страниц (7): [1] 2 3 4 5 6 7 »
 

1. Kibor - 09 Августа, 2015 - 23:17:19 - перейти к сообщению
Появилась возможность подключения внешних DLL и вызов со скрипта их функций.
Подключать можно как и свои библиотеки, так и любые стандартные используя после этого Win API при написание скриптов в Кибор.

Это существенно расширяет круг решаемых в Кибор задач, так как становятся доступные практически все Api которое можно использовать прямо программируя в Кибор и часть программы можно написать на любом языке и скомпилировать в Dll, которую можно потом подключить в скрипте и использовать.

Свою Dll можно упаковать в ресурсы собранного exe и тогда не придется ее распространять отдельно вместе с программой.

external(INT, "my_message", "MessageBoxA", "user32.dll");//Получение указателя на функцию MessageBoxA

Подключает user32.dll, получает указатель на Api функцию MessageBoxA, указывает что в скрипте мы ее будем вызывать по символическому имени my_message и возвращать эта функция будет тип int

Функция возвращает дескриптор загруженного DLL модуля, по которому можно можно выгрузить эту DLL с помощью freelibrary.
Внимание! Выгрузка определенного DLL приведет к недоступности всех функций загруженных с DLL с этим именем!

ВНИМАНИЕ! Данные функции вызываются ОДИН раз в начале скрипта! Не надо их вызывать при каждом действие с подключаемой функцией! Это ничего не даст. Просто Кибор будет игнорировать эти команды, до того пока эта DLL не будет выгружена с помощью freelibrary.

Пример создания и подключение своего диалогового окна созданного в Visual Studio

Открытие ссылки
CODE:
external(INT, "ShellExecute", "ShellExecuteA", "Shell32.dll");
ShellExecute(0, "Open", "http:/^/kibor-bot.com/education-kibor.php", 0, "", 61728);


Создание папки..
CODE:
external(INT, "CreateDirectory", "CreateDirectoryA", "kernel32.dll");
CreateDirectory("C:\mu_fol", 0);


удаление файла
CODE:
external(INT, "DeleteFile", "DeleteFileA", "kernel32.dll");
DeleteFile("C:\ttt.txt");


переименовать
CODE:
external(INT, "MoveFile", "MoveFileA", "kernel32.dll");
MoveFile("C:\Этот_переименовать.txt", "C:\В_этот.txt");


Прокрутка ролика мышки
CODE:
external(VOID, "mouse_event", "mouse_event", "user32.dll");
mouse_event(2048, 0, 0, -500, 0);


Перемещаем папку 5 с папки 1 в 2
CODE:
external(VOID, "MoveFile", "MoveFileA", "kernel32.dll");
MoveFile("C:\Новая папка\1\5", "C:\Новая папка\2\5");


Одновременное проигрывание wav или mp3 файлов
CODE:
external (INT, "mciSendString", "mciSendStringA", "Winmm.dll");

mciSendString("open C:\1\b.wav", 0, 1, 0);//Длинный
mciSendString("open C:\1\h.wav", 0, 1, 0);//Короткий
loop()
{
mciSendString("play C:\1\b.wav", 0, 1, 0);
loop(20)
{
mciSendString("play C:\1\h.wav", 0, 1, 0);
sleep(100);
mciSendString("close C:\1\h.wav", 0,1, 0);
}
mciSendString("close C:\1\b.wav", 0,1, 0);
}


Зацикливание проигрывания
CODE:
external (INT, "mciSendString", "mciSendStringA", "Winmm.dll");

char SST[256];
int adr=address(#SST[0]);
mciSendString("open C:\1\b.wav", 0, 1, 0);

loop()
{
mciSendString("play C:\1\b.wav", 0, 1, 0);
mciSendString("status C:\1\b.wav mode", adr, 256, 0);
while(format(#SST[0])=="playing")mciSendString("status C:\1\b.wav mode", adr, 256, 0);
mciSendString("close C:\1\b.wav", 0,1, 0);


messagebox ("Усе. Можно сначала");//Закоментировать для зацикливания


}


Первый параметр INT DOUBLE STRING CHAR VOID. Что возвращает функция. VOID говорит о том что функция не возвращает ничего.
Второй - символическое имя по которомы мы будем юзать эту функцию в скрипте.
Третий - Оригинальное название функции в библиотеке
Четвертый - подключаемая библиотека.

Пример использования Api в скрипте и перенос части кода в внешнюю свою Dll, которую запаковали в ресурс собранного exe. Скачать собранный EXE с запакованной в него Dll, которая распакуется при первом запуске в папку программы http://kibor-bot.com/files/KiborDll.rar
 Цитата:
unpack("C:\MuDll.dll", pathfolder()+"MuDll.dll", 0);//Распакуем свою Dll с ресурсов в папку программы

//Это подключение тандартных динамически компонуемых библиотек (user32.dll, kernel32.dll и тд) для работы с Win API
external(INT, "my_message", "MessageBoxA", "user32.dll");//Получение указателя на функцию MessageBoxA
external(VOID, "my_exit", "ExitProcess", "kernel32.dll");//Получение указателя на функцию ExitProcess

//Это подключение своих Dll которые должны быть в папке с программой. Все тоже самое.
external(INT, "my_add", "Add", "MuDll.dll");//Получение указателя на функцию Add
external(VOID, "my_pisk", "DllCod", "MuDll.dll");//Получение указателя на функцию DllCod

//После подключения Dll и определения адресов вызываемый функций (третий параметр) с Dll их можно вызывать с Кибор по указанному нами во втором параметре имени.
messagebox ("сумма 57+7="+format(my_add(57, 7)));//Вызываем функцию Add со своей Dll
char c[250];
strcpy(#c[0], "Этот код работает с DLL. Текст передали в параметре функции.");
my_pisk(2000, 1000, address(#c[0]));//Вызываем функцию DllCod со своей Dll

//Тут используем в скрипте вызов Api функций с user32.dll и kernel32.dll
int a;
s: a=my_message(0, "Закрыть программу??????", "Заголовок", 6);//Вызовем MessageBoxA с user32.dll
if (a==10)goto s;
if (a==11)my_exit(0);//Вызовем ExitProcess с kernel32.dll

RESOURCE
{
"C:\MuDll.dll"//Запакуем свою DLL в ресурсы собранного exe
}


а это код самой MuDll.dll
 Цитата:
#include < windows.h >


extern "C" __declspec(dllexport)int Add(int i1, int i2)
{
return i1+i2;
}

extern "C" __declspec(dllexport)void DllCod(int p1, int p2, char* c)
{

Beep(p1,p2);
MessageBox (0, c, "Окно с DLL", 0);
}


=====================================================

Заполнение структуры для передачи в виде параметра в GetSaveFileNameA.. Используется COMDLG32.

CODE:
external(VOID, "GetSaveFile", "GetSaveFileNameA", "COMDLG32.DLL");
char b[100];
strcpy(#b[0], "файл");
char f[256];
for (int n=0; n<256; n++)f[n]=0;
char a[77];
for (n=0; n<77; n++)a[n]=0;

writeaddress(76, address(#a[0]));
writeaddress(0, address(#a[4]));
writeaddress(0, address(#a[8]));
writeaddress(address(#b[0]), address(#a[12]));
writeaddress(0, address(#a[16]));
writeaddress(1634928, address(#a[20]));
writeaddress(1000, address(#a[24]));
writeaddress(0, address(#a[28]));


writeaddress(0, address(#a[32]));
writeaddress(address(#f[0]), address(#a[36]));
writeaddress(6148, address(#a[40]));

GetSaveFile(address(#a[0]));
messagebox (format(#f[0]));



Выбрать файл для его открытия
CODE:
external(VOID, "GetOpenFileName", "GetOpenFileNameA", "COMDLG32.DLL");

char b[512];
b[0]=formatic(0);

char a[77];
for (int n=0; n<77; n++)a[n]=0;

writeaddress(76, address(#a[0]));
writeaddress(0, address(#a[4]));
writeaddress(0, address(#a[8]));
writeaddress(0, address(#a[12]));
writeaddress(0, address(#a[16]));
writeaddress(1634928, address(#a[20]));
writeaddress(1000, address(#a[24]));
writeaddress(address(#b[0]), address(#a[28]));
writeaddress(512, address(#a[32]));
writeaddress(0, address(#a[36]));
writeaddress(6148, address(#a[40]));

GetOpenFileName(address(#a[0]));
messagebox(format(#b[0]));


Главная проблема правильно заполнить структуру, указатель на которую надо передать в виде параметра функции..
2. Kibor - 10 Августа, 2015 - 15:21:47 - перейти к сообщению
Добавил функцию address. Возвращает указатель на переменную которая задана в параметре.

CODE:
char h[512];
int adr=address(#h[0]);


Параметр - указатель на переменную в Кибор.

Этот адресс можно использовать в любых Api где принимается указатель..

Это пример как юзать одну из Api функций для перебора окон в системе.
CODE:
external(INT, "my_windows", "FindWindowExA", "user32.dll");
external(VOID, "my_getname", "GetWindowTextA", "user32.dll");

string all[2000];
char h[512];
int adr=address(#h[0]);
int a=my_windows(0, 0, 0, 0);

int n=0;
s: if (a!=0)
{
h[0]=formatic(0);
my_getname(a, adr, 512);
all[n]=format(#h[0]);
a=my_windows(0, a, 0, 0);
n++;
goto s;
}

if (fopen ("c:\Окна.txt", "w")!=0)
{
for (int x=0; x<n; x++)
{
fwrite(all[x]);
fwrite(ENDL);
}
fclose();
}


start ("c:\Окна.txt");


Так же address Можно использовать для получения указателя на зарегистрированную в коде Кибор функцию.
Получения указателя на внутреннюю функцию WindowProc
CODE:
int WinProc=address("WindowProc");



Добавил функции считывающие данные с какого то адреса исходя из типа переменной в которую считываются эти данные.

addressi - считывает 4 байта (int)
addressd - считывает 8 байт (double)
addresss - считывает до первого 0 строку (string)
addressc - считывает 1 символ байт (char)

синтаксис
CODE:
int r=12345;
int int_address=address(#r);
int a=addressi(int_address);
messagebox (a);


CODE:
string r="asdfgh";
int int_address=address(#r);
string a=addresss(int_address);
messagebox (a);


и тд..

Пример чтения структуры RECT
typedef struct _RECT {
LONG left;
LONG top;
LONG right;
LONG bottom;
} RECT, *PRECT;


CODE:
external(INT, "My_GetWindowRect", "GetWindowRect", "user32.dll");

int hwnd=HWND окна. получаем любой функцией. к примеру FindWindowExA

char poz_siz[16];//Это для заполнения структуры RECT
/*
typedef struct _RECT {
LONG left;
LONG top;
LONG right;
LONG bottom;
} RECT, *PRECT;
*/
// LONG имеет 4 байта. Значит вся полная структура 16
My_GetWindowRect(hwnd, address(#poz_siz[0]));

//Тут разберем структуру по 4 байта.
int t[4];

t[0]=addressi(address(#poz_siz[0]));
messagebox ("Левый угол Y "+format(t[0]));

t[1]=addressi(address(#poz_siz[4]));
messagebox ("Левый угол Y "+format(t[1]));

t[2]=addressi(address(#poz_siz[8]))-t[0];
messagebox ("Размер X "+format(t[2]));

t[3]=addressi(address(#poz_siz[12]))-t[1];
messagebox ("Размер Y "+format(t[3]));
3. BOT.TAK - 26 Января, 2016 - 07:31:20 - перейти к сообщению
Добрый день!

Посмотрев темы про SendKey(...) понял, что решить задачу отправки сочетаний клавиш в неактивное окно нет. Подскажите а возможно с помощью внешних DLL.
Нужно в excel отправить сочетание ctrl+h

 Kibor пишет:
4. Kibor - 26 Января, 2016 - 07:41:22 - перейти к сообщению
я не знаю способа отправки в не активное ЗАжатий.
но...
подсказка..
контрл мы Зажмем в активном, остальное в send..
5. ko4evnik - 17 Июля, 2016 - 01:51:08 - перейти к сообщению
Ни как не могу подключить свою dll к Кибору. Библиотека написана на C# вот пример простейшей библ.
CODE:
namespace test
{
public class Class1
{
public static int sum (int a, int b)
{
int c = a + b;
return c;
}
}
}

Получаю указатель
CODE:
external(INT, "my_add", "sum ", "test.dll");

пишет "Ошибка получения адреса функции sum". В чем моя ошибка?
Хотя при подключении этой библ. к проекту написанному в VS на C# все нормально подключается.
6. Kibor - 17 Июля, 2016 - 01:58:26 - перейти к сообщению
Не знаю.. если библиотека нормальная все должно работать..
Проверено не на одной dll...
7. ko4evnik - 17 Июля, 2016 - 04:36:55 - перейти к сообщению
dll написанная на delphi также нормально подключается к Кибор, а которые на c# немогу подключить ни одну dll.
Не могли бы вы дать пример dll на c# которая подключается к Кибор?
8. Kibor - 17 Июля, 2016 - 04:55:59 - перейти к сообщению
У меня нет на с#
Не знаю. Пока не встречал проблем.. Да и все системные библиотеки подключаются..
9. v0id - 14 Августа, 2016 - 14:21:10 - перейти к сообщению
 ko4evnik пишет:
dll написанная на delphi также нормально подключается к Кибор, а которые на c# немогу подключить ни одну dll.
Не могли бы вы дать пример dll на c# которая подключается к Кибор?



Может я глупость скажу, но может дело в том что в C# нет понятия функции. А классы и методы Кибор не поддерживает. В идеале сам хотел бы использовать c# и vs, так как, как среда для меня несколько привычнее и удобнее оригинальной программы
10. 007wan - 14 Октября, 2017 - 04:45:43 - перейти к сообщению
 BOT.TAK пишет:
external(INT, "My_GetWindowRect", "GetWindowRect", "user32.dll");

А есть какие-нибудь другие параметры, где ""? не те, которые выше есть, а есть ли те, которые вы не показывали? можете огласить список и их назначение.

Powered by ExBB FM 1.0 Final