PDA

Просмотр полной версии : вопрос по PaxCompiler


supernewbie
22.05.2011, 13:49
недавно начал юзать пакс кампилер, но уже нашёл какую-то хрень, а у них весь форум на английском и ваще мутный )

почему когда я пишу в коде, котоырй потом буду компилить, unit Unit1; или
program Program1; то метод PaxProgram.CallRoutine не может найти не одного метода в программе, пачму такое может происходить в этом мире?

Добавлено через 6 часов 33 минуты
почему методы классов он видит, а обычные процедуры не видит :\

Добавлено через 6 минут
арррррр... вместо PaxProgram.CallRoutine('Proc', [s]); надо было писать PaxProgram.CallRoutine('Unit1.Gal1', [s]);

Добавлено через 6 минут
пля, теперь как узнать как юзер назвал юнит\прогу)

Добавлено через 9 часов 8 минут
ну блиин, помогите))

xkor
22.05.2011, 16:25
пля, теперь как узнать как юзер назвал юнит\прогу)по идее название юнита или проги в дельфи должно совпадать с названием файла, если код берётся не из файла, то наверняка в PaxCompiler есть метод возвращающий название модуля, ну а на худой конец и самому парсер извлекающий название не сложно написать...

supernewbie
22.05.2011, 16:39
про парсер - :\

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

Добавлено через 1 минуту
у алекса в ексте же пакс стоит или нет?
пусть скажет как он там че сделал)

xkor
22.05.2011, 16:47
supernewbie, думаю он там просто не использует возможность задания имени модуля)

supernewbie
22.05.2011, 16:56
где такое врубать?)

alexteam
22.05.2011, 16:59
xkor, ваши речи непонятны 0_o

supernewbie
22.05.2011, 17:06
блин да че делать та) даже потенциально спасительный PaxCompiler.OnUsedUnit оказался не тем(

alexteam
22.05.2011, 17:11
supernewbie, ваши тоже 0_о

supernewbie
22.05.2011, 17:20
ай ***дь...

xkor
22.05.2011, 17:35
alexteam, ты свои то понимаешь?)

alexteam
22.05.2011, 17:48
с трудом..

supernewbie
22.05.2011, 17:52
пля, ну че, парсер чтоли писать, стремно че-то так :\

alexteam
22.05.2011, 18:01
ну, т.к. мне такое нафик не надо было то даже не пытался чтото такое делать.
есть в паксе небольшие грабли. тебе нужно запустить ППрограм перед тем как вызывать чтолибо "по поинтеру" оттуда.
а что если пустить прогу сразу в пошаговом выполнении. и "подсмотреть" PProgram.modulename

supernewbie
23.05.2011, 15:27
т.е. ты не вызываешь в скрипте функции там всякие, типо OnPacket или OnNpcSpawn?

Добавлено через 1 час 1 минуту
PaxProgram.Run;
ShowMessage(PaxProgram.ModuleName); выдает '', я хз

Добавлено через 19 часов 54 минуты
пля пацаны че делать, пакс не понимает строку
RegisterTypeDeclaration(H, 'PProtocolParam=^TProtocolParam;');
а именно знак ^

Добавлено через 24 минуты
надеюсь это прально.. RegisterPointerType(H, 'PProtocolParam', G);

alexteam
24.05.2011, 10:24
т.е. ты не вызываешь в скрипте функции там всякие, типо OnPacket или OnNpcSpawn?
в скриптах там подругому сделано.

supernewbie
24.05.2011, 11:22
они в другом потоке крутятся в цикле?

alexteam
24.05.2011, 12:13
при чем тут это ?

supernewbie
24.05.2011, 15:42
ну расскажи как сделано то у тебя там)

xkor
24.05.2011, 16:53
supernewbie, не знаю как у алекса, но я бы на его месте делал через наследование в скрипте от класса реализующего доступ к основным функциям бота и перезаписывающего методы-события, и а дальше надо только указать программе юзать этот класс.

supernewbie
27.05.2011, 15:27
блин, я уже совсем запарился

почему он полностью видит все проперти и методы у TImage, хотя я регнул его всего 1 строкой G1:=RegisterClassType(H, TImage);
а вот мой класс, регнутый этой же строкой, вообще пустой регается?

я найду этого ублюдка который ему так это сделал! ©

просто вдруг надо как-то класс свой изменить для нормальной регистрации, руками регать стремна как-то :(

Добавлено через 3 минуты
вот алексу же 100% пришлось регать свой engine со всякими там TL2Type

alexteam
27.05.2011, 16:12
supernewbie, PaxCompilerImp.exe

supernewbie
27.05.2011, 16:59
то прописать ему всё это всё-таки надо... ну окей че..

Добавлено через 28 минут
слушайте, такое ощущение что он ещё и работает

Добавлено через 9 минут
а нет, показалось

Fertis
27.05.2011, 17:25
что не работает то? :)

supernewbie
27.05.2011, 18:18
импортировал модуль свой, заюзал его, щас пишет в скрипте при юзе класса, котоырй в импортированом модуле - Syntax Error

Добавлено через 8 минут
так, странно...

Добавлено через 2 минуты
пля акуеть, закоментил по кусочкам код, почти весь, заработало, откаментил весь код покусочкам - работает!!! да как так))))

Добавлено через 11 минут
блин, че он переменные то не делает

Добавлено через 28 минут
ну что ж, поехали всё канапатить в
проперти ЭфПеременная : тип читать Переменная писать Переменная;

alexteam
27.05.2011, 18:25
блин, че он переменные то не делает
делает.

supernewbie
27.05.2011, 22:06
а че у меня не делает?

Добавлено через 1 минуту
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

end.



unit IMPORT_Unit1;
interface
uses
Windows,
Messages,
SysUtils,
Variants,
Classes,
Graphics,
Controls,
Forms,
Dialogs,
StdCtrls,
Unit1,
PaxCompiler,
PaxRegister;
procedure RegisterIMPORT_Unit1;
implementation
procedure RegisterIMPORT_Unit1;
var G, H: Integer;
begin
H := RegisterNamespace(0, 'Unit1');
// Begin of class TForm1
G := RegisterClassType(H, TForm1);
RegisterHeader(G,
'constructor Create(AOwner: TComponent); virtual;',
@TForm1.Create);
// End of class TForm1
RegisterVariable(H, 'Form1: TForm1;',@Form1);
end;
initialization
RegisterIMPORT_Unit1;
end.


баттон где?

Добавлено через 3 часа 35 минут
ну блин, че за фигня, подскажите или я уже пошёл в проперти переделывать эту хрень)

xkor
27.05.2011, 23:15
баттон где?всмысле где, он published и для его регистрации не надо отдельного кода, он регится тут:
G := RegisterClassType(H, TForm1);

Добавлено через 2 минуты
хм, а хотя раз он поле а не свойство то может автоматом и не региться

supernewbie
28.05.2011, 11:50
нифига! нету кнопки там

Добавлено через 2 минуты
чеделатьта

Добавлено через 12 часов 27 минут
селедка

alexteam
28.05.2011, 15:33
как функцию оформи. ы.

supernewbie
28.05.2011, 15:55
я не уверен что смогу так сделать ©

xkor
28.05.2011, 16:29
вот так должна быть видна под именем Button_1:
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
private
{ Private declarations }
public
{ Public declarations }
published
property Button_1: TButton read Button1 write Button1;
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

end.

supernewbie
28.05.2011, 16:53
ну так ясен хрен видно) ладно, пойду переделывать все переменные в проперти

mira
21.06.2011, 10:59
Возник вопрос умеет ли пк вызывать функи из приложения и наоборот как фс.
То у меня появилось подозрение на кривую многопоточность фса.
Тоесть когда выполняетса фс.execute если выполнить фс.callfunction из другова потока чето походу слетает порой

supernewbie
21.06.2011, 15:30
канеш умеет, регаешь в пакс функции свои (PaxRegister) и юзаешь Prog.CallRoutine

Добавлено через 1 час 43 минуты
не юзай фс не в коем случае, он гогно

mira
24.06.2011, 11:18
У меня скрипт никаких расчетов почти не делает тока реализует логику, скорость пох. Просто последнее время убивает нестабильность и глючность фс 1.1

вощем перехожу на пакс. Вроде все вкусно но пока невтыкаю как скажем закрыть текущий модуль и загрузить и запустить новый.

Добавлено через 23 часа 55 минут
Что неверно?)
i:integer;
p:procedure(a,b:integer,s:string);
......
i:=compiler.gethandle(0,`onxxx`,true);
p:=prog.getaddress(`module`,i);
p(3, id, `бафни`);
________________ в скрипте
procedure onxxx(ci:integer; oid:integer: s:string);
begin
if s='бафни' then begin
settarget(id);
useskill(skill_emp,false,false,true,false);
end;
end

итог - бафает потом выдает эксепшн. Фс норм. Что у них не fastcall чтоли или я мудаг?

alexteam
24.06.2011, 11:27
i:integer;
p:procedure(a,b:integer;s:string);stdcall;
......
i:=compiler.gethandle(0,`onxxx`,true);
p:=prog.getaddress(`module`,i);
p(3, id, `бафни`);
________________ в скрипте
procedure onxxx(ci:integer; oid:integer; s:string); stdcall;
begin
if s='бафни' then begin
settarget(id);
useskill(skill_emp,false,false,true,false);
end;
end

mira
24.06.2011, 21:14
Коротк и ясно:)

Добавлено через 6 часов 46 минут
и не работает на скрипте бота. работает тока в программе test.exe =))
неужели у них какието особенности постоения скрипта
вон тут конкатенация порадовала s:='vasia'+' '+'hello'
ожидаю vasia hello а получаю vasiahello

alexteam
24.06.2011, 21:28
неужели у них какието особенности постоения скрипта
там единственная сложность - получить хендл неймспейса с твоей функцией.

ожидаю vasia hello а получаю vasiahello
ты попробуй принт строчки 'еееюююяяя' сделать )
там много "своихприколов" )
но все равно хорошая штука, т.к. не интерпритатор.

Добавлено через 6 минут
ну в общем кактотак:
hmod := PC.GetHandle(0, 'namespacename', true);
hfunc := PC.GetHandle(hmod, 'funcname', true);
pfunc := PP.GetAddress(hfunc);
TmyFunc(pfunc)(MyFuncParam);

при чем скрипт как таковой, можно сохранить в бинарке, но при этом незабыть приложить к нему все используемые с скрипта hfunc, чтобы потом при загрузке бинарки получить по ним валидные pfunc

mira
24.06.2011, 21:51
procedure PaxWriteStr(s:string);
begin
showmessage(s);
end;

zagruzka
.....
fPaxCompiler:=TPaxCompiler.Create(nil);
RegisterHeader(0, 'procedure WriteStr(s : string);', @PaxWriteStr);
fPaxCompiler.Reset;
fPaxPascalLanguage:=TPaxPascalLanguage.Create(nil) ;
fPaxCompiler.RegisterLanguage(fPaxPascalLanguage);
fPaxCompiler.AddModule('mainmodule',fPaxPascalLang uage.LanguageName);
fPaxCompiler.AddCodeFromFile('mainmodule',filname) ;
result:=fPaxCompiler.Compile(PaxProgram1);
scriptloaded:=result;
.....

script
.....
writestr('shillen saint profile');
.....

при любых параметрах показывает пустой бокс, строка попадающая в функцию всегда = ''

alexteam
24.06.2011, 22:00
ресет разве не трет все регистрелангвиджи и регистерхеадеры ?

fPaxCompiler:=TPaxCompiler.Create(nil);
fPaxPascalLanguage:=TPaxPascalLanguage.Create(nil) ;

fPaxCompiler.Reset;
fPaxCompiler.RegisterLanguage(fPaxPascalLanguage); //рега языка после ресета
fPaxCompiler.RegisterHeader(0, 'procedure WriteStr(s : string);', @PaxWriteStr); //рега ф-й после реги языка.

fPaxCompiler.AddModule('mainmodule',fPaxPascalLang uage.LanguageName); //код
fPaxCompiler.AddCodeFromFile('mainmodule', filname);
result:=fPaxCompiler.Compile(PaxProgram1);
scriptloaded:=result;
ну и paxProgram.Run; гдето.

кстати, учитывай еще такой интересный факт. что после компиляции тебе нужно вызвать run если ты планируешь юзать ф.и. из пакса. т.е. компильяция - запуск (даже если тело программы пустое) и только потом вызов всяких там "onxxx"
в противном случае будут сюрпризы )

mira
24.06.2011, 22:19
таки да, я уж сам переставил. тотже болт тока в левой руке.
попробую подсунуть юнит тока с одной функцией... может ее остальной скрипт сбивает с толку. хотя в рамках делфи в нем все верно

alexteam
24.06.2011, 22:21
у тебя
"writestr('shillen saint profile');" где ?
в функции вызываемой с делфы ?
или в теле скрипта (между бегин и эндсточкой) ?

mira
24.06.2011, 22:33
в скрипте. тока не в основном блоке.
есть в скрипте
finction Init:boolean;
writestr('shillen saint profile');
блаблабла
end;

осле загрузки скрипта она вызываетса методом GetHandle итд
затем rogram.run

alexteam
24.06.2011, 22:58
кстати, учитывай еще такой интересный факт. что после компиляции тебе нужно вызвать run если ты планируешь юзать ф.и. из пакса. т.е. компильяция - запуск (даже если тело программы пустое) и только потом вызов всяких там "onxxx"
в противном случае будут сюрпризы )
вызов функции -> пп.ран = фейл
пп.ран -> вызов функции = профит.

Добавлено через 2 минуты
по идее первый ран перед тем как вызвать инит - можно в пошаговом выполнении. а потом после вызова инита резум.

mira
24.06.2011, 23:06
щас проверим

Добавлено через 2 минуты
хм а как же мне инициализировать всякие там переменные и подготовить модуль к работе? если я запущу ран без подготовки сюрпризов будет не менше

alexteam
24.06.2011, 23:16
хм а как же мне инициализировать всякие там переменные и подготовить модуль к работе? если я запущу ран без подготовки сюрпризов будет не менше
да блин.. второй раз подряд зеваешь ответ.
по идее первый ран перед тем как вызвать инит - можно в пошаговом выполнении. а потом после вызова инита резум.

Добавлено через 7 минут
PaxCompilerDebugger := TPaxCompilerDebugger.create(nil);
PaxCompilerDebugger.RegisterCompiler(paxCompiler, paxProgram);
PaxCompilerDebugger.RunMode := _rmTRACE_INTO;
paxProgram.Run; //тут кстати, вызовется еще и в дебагере метод, в который стравят имя модуля, так что таким образом ты заодно и сможешь получить имя неймспейса основного модуля.
TYourFunc(func_pointer);
PaxCompilerDebugger.RunMode := _rmRUN;


//calling execute's;
paxProgram.Run; //1
paxProgram.Run; //2
paxProgram.Run; //3

supernewbie
25.06.2011, 00:04
paxProgram.Run; //тут кстати, вызовется еще и в дебагере метод, в который стравят имя модуля, так что таким образом ты заодно и сможешь получить имя неймспейса основного модуля.

не нашел че-то такого метода в дебагере

alexteam
25.06.2011, 00:35
в програм*

supernewbie
25.06.2011, 00:36
а там то где

alexteam
25.06.2011, 00:38
paxProgram.OnPause

supernewbie
25.06.2011, 00:44
ну ахрененно, выдал "mainmodule", не то это(

как заставить его сказать имя вот этого модуля :
текст скрипта:
unit Unit1;

interface

uses
Dialogs;

procedure onxxx(s:string);stdcall;

implementation

procedure onxxx(s:string);stdcall;
begin
if s='бафни' then begin
ShowMessage(s);
end;
end;

begin

end.


Unit1 как можно вычленить?

mira
25.06.2011, 15:08
думал немного поразбираюсь и все станет ясно ан нет, все больше тупею.
объявил пред-инициализированную переменную как в делфи
var
binited : boolean = false;

дак эта переменная получилась readonly какаяже это переменная ****!

Добавлено через 1 час 49 минут
и вообще, если пакс инициализирован загружет и создан в одном потоке а выполняетса в другом это для него тоже противоестественно?)

supernewbie
25.06.2011, 15:48
версия пакса то 2.8?
а то у меня с пред-инициализированными переменными все норм

с потоками всё норм

mira
25.06.2011, 16:10
вот такой вот наивный скрипт

var
binitialized:boolean=false;
begin
if not binitialized then begin
binitialized:=true;
showmessage('погнали');
exit;
end;
showmessage('мы инициализированы!);
end.

у меня всегда выводит "погнали" при каждом Run
более того полсе 20-100500 Run-ов пакс ломаетса и все последующие раны выдают исключение ниче не выполнив.
видимо придетса забить на пакс(( условия чтоли для него суровые слишком чтоб работать в другом процессе да еще и разных потоках

supernewbie
25.06.2011, 16:22
видимо там инициализация при ране штоле

PS проще по-моему сделать процедуру чтоли, чем begin end. вызывать

mira
25.06.2011, 16:32
процедуры тоже, то работаю то критуют то работаю потом критуют. в фсе норм было все

Добавлено через 53 секунды
тупых ошибок нет)
если тока пробывать создать объекты скрипта и загрузку в самом потоке бота

alexteam
26.06.2011, 12:48
var
binitialized:boolean=false;
присваивание выполняеццо при каждом ране ? )

Добавлено через 3 минуты
процедуры тоже, то работаю то критуют то работаю потом критуют. в фсе норм было все
тупых ошибок нет)

значит есть. у меня сбор\разбор пакетов в паксе крутиццо. проблем вроде нет.
binitialized:boolean=false;
это вообще можно экспортировать в пакс как поле экземпляра класса.

mira
27.06.2011, 10:46
это глобальная переменная. Хош сказать пакс перед каждым выполнением ран ее ставит в дефолтное значение а не инициализирует значение при компиляции?

xkor
27.06.2011, 14:36
mira, ну пакс это всётаки больше скриптовый движек чем полноценный компилятор с хорошей оптимизацией, так что вполне вероятно и я бы даже сказал более логично что они инициализирует и глобальные переменные при ране а не при компиляции

mira
28.06.2011, 15:08
Значит нада юзать его как длл. :)
выполнять ран типа дллмайн, все инициализировать там а потом юзать какуюнеть экспортируюмую рутину.

mira
08.08.2011, 11:18
Ребят еще есть вопрос :)
на их форуме смарел ваще инфы 0.
Дело такое :
регаю в скрипт свою процедуру.
Можно ли во время выполнения получить инфу о ней, скажем о ее параметрах (понятно в программе а не скрипте)

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