• B правой части каждого сообщения есть стрелки и . Не стесняйтесь оценивать ответы. Чтобы автору вопроса закрыть свой тикет, надо выбрать лучший ответ. Просто нажмите значок в правой части сообщения.

Fs-скрипт и Dll

NickProstoNick

Статус как статус :)
Lotus Team
22.08.2008
1 851
27
BIT
0
Всем привет!
Есть вот такой FS-скрипт (Все примеры взяты из примера)
Код:
var
i,i1,i2 : integer; // целые числа.
s : string; // строковая переменная/буфер.
r : single; // short-float, не целое число.
hlib : handle; // хендл dll
res : integer; // результат ф-ций.

begin
ScriptTimeOut(99999); // выключим таймер в скрипт-тестере.
hlib := gDLL.LoadLib('dll\l2_bsfg.dll'); // DLL системная, можно путь не указывать
if _isScriptTester then
// FuncTst4:
//
// вызовем ф-цию FuncTst4 из DLL
// ф-ция c 3 параметрами указатель на строку/блок памяти, и 2 integer'а.
// последний параметр - переменная.
// (описание ф-ций в DLL должны четко совпадать !)
//
writelogln('');
writelogln(' FuncTst4:');
i2 := 0;
s := 'Это строка буфера, 123123123123юбыабыва23бьбь3б3б3б1б1б1б1б133433убвавыа';
//
writelogln(' заданные параметры: ');
writelogln('буфер, размер '+inttostr(length(s))+'байт');
writeloghexb(s);
//
res := gDLL.CallFuncF5(hlib,'FuncTst4','sdD',s, length(s), i2, null, null);
i1 := GetLastError;
if (res = -1) and (i1 <> 0) then begin
writelogln(' Функция не найдена?, ошибка: '+SysErrorMessage(i1));
end else begin
writelogln(' данные после вызова ф-ции: ');
writeloghexb(s);
writelogln(format('%s %d',[' ф-ция вернула значение: ',res]));
writelogln(format('%s $%x',['третий параметр: ',i2]));
end;

end.

Ксть вот такая ф-я написаная на delphi ( в DLL)
Код:
function FuncTst4(pc : pchar; le : integer; var i : integer) : integer; stdcall;
var i0 : integer;
begin
// обычно так передаются блоки памяти, второй параметр (константа) - его максимальный размер.
// возвращают (например, в третьем параметре) используемый размер буфера.
// пакеты можно обрабатывать по этому же принципу. =)
//
// заменим все символы от '0' до '9' (все цифры) в блоке на '*'
// вернем количество изменений.
// в последнем параметре вернем номер последнего исправленного символа.
//
// 'pc' - это указатель на первый символ блока, 'le' - размер.
// ! Заметьте, индексация в скрипте начинается с единицы, здесь - с нуля ! в скрипте это банальная строка.
// (хотя можно сделать и через виртуальный массив с единицы, кто как хочет тот так ... и делает)
//
result := 0;
for i0 := 0 to le-1 do begin
if pc[i0] in ['0'..'9'] then begin
pc[i0] := '*';
Inc(Result);
i := i0;
end;
end;

end;

exports FuncTst4;

Не получается восстановить входную строку 'Это строка буфера, 123123123123юбыабыва23бьбь3б3б3б1б1б1б1б133433убвавыа'

В pc[i0] полній бред ;)
 
H

hosm

Есть предположение, что string и Pchar преобразовываются неправильно.
Завести, мб, переменную ps:=PChar(s) и ее передавать? В общем, попробуй в эту сторону покопать.
ps: а вот все варианты приведения типа
 

NickProstoNick

Статус как статус :)
Lotus Team
22.08.2008
1 851
27
BIT
0
Есть предположение, что string и Pchar преобразовываются неправильно.
Завести, мб, переменную ps:=PChar(s) и ее передавать? В общем, попробуй в эту сторону покопать.
ps: а вот все варианты приведения типа
Я пробовал писать ДЛЛ на С++ - проблем с типами нет... но есть проблемы со знанием С++ :)
 
M

mss

> res := gDLL.CallFuncF5(hlib,'FuncTst4','sdD',s, length(s), i2, null, null);

Что за ересь в 3-м параметре ?
 
H

hosm

mss
а чё сразу ересь? вроде как описание формата 3х передаваемых далее параметров
NickProstoNick
так спрашивай по с++ - мб, народ подскажет, сишники на форуме есть. сама я, увы, слабо его помню.
 

NickProstoNick

Статус как статус :)
Lotus Team
22.08.2008
1 851
27
BIT
0
mss
а чё сразу ересь? вроде как описание формата 3х передаваемых далее параметров
NickProstoNick
так спрашивай по с++ - мб, народ подскажет, сишники на форуме есть. сама я, увы, слабо его помню.
Угу :( сам полный "0".. вот мат.часть читаю.
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!