Fs-скрипт и Dll

Тема в разделе "Pascal and Delphi", создана пользователем NickProstoNick, 25 фев 2011.

  1. NickProstoNick

    NickProstoNick Статус как статус :)

    Регистрация:
    22 авг 2008
    Сообщения:
    1.766
    Симпатии:
    39
    Всем привет!
    Есть вот такой FS-скрипт (Все примеры взяты из примера)
    Код (Delphi):
    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)
    Код (Delphi):
    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] полній бред ;)
     
  2. hosm

    hosm * so what *

    Регистрация:
    18 май 2009
    Сообщения:
    2.450
    Симпатии:
    7
    Есть предположение, что string и Pchar преобразовываются неправильно.
    Завести, мб, переменную ps:=PChar(s) и ее передавать? В общем, попробуй в эту сторону покопать.
    ps: а вот все варианты приведения типа http://www.delphifaq.com/faq/delphi/strings/f105.shtml
     
  3. NickProstoNick

    NickProstoNick Статус как статус :)

    Регистрация:
    22 авг 2008
    Сообщения:
    1.766
    Симпатии:
    39
    Я пробовал писать ДЛЛ на С++ - проблем с типами нет... но есть проблемы со знанием С++ :)
     
  4. mss

    mss Гость

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

    Что за ересь в 3-м параметре ?
     
  5. hosm

    hosm * so what *

    Регистрация:
    18 май 2009
    Сообщения:
    2.450
    Симпатии:
    7
    mss
    а чё сразу ересь? вроде как описание формата 3х передаваемых далее параметров
    NickProstoNick
    так спрашивай по с++ - мб, народ подскажет, сишники на форуме есть. сама я, увы, слабо его помню.
     
  6. NickProstoNick

    NickProstoNick Статус как статус :)

    Регистрация:
    22 авг 2008
    Сообщения:
    1.766
    Симпатии:
    39
    Угу :( сам полный "0".. вот мат.часть читаю.
     
Загрузка...

Поделиться этой страницей