Вызов функций из внешней DLL

отредактировано 05:50 Раздел: FastScript
Можно ли? Если да, то как?
Предполагается, что библиотеки могут быть любыми и функции тоже. Т.е. заранее в коде самой программы "оболочку" вроде не пропишешь.

Комментарии

  • отредактировано March 2006
    Все можно. Главное зарегистрировать в FS нужные функции (для работы с Dll)
  • отредактировано 05:50
    LoadLibrary и всё такое? ;)
  • отредактировано 05:50
    написал:
    Все можно. Главное зарегистрировать в FS нужные функции (для работы с Dll)
    Пример пожалуйста в студию вызова динамически загружаемой библиотеки из скрипта а какие "нужные функции" гужно зарегистрировать в FS.
  • отредактировано 05:50
    2>>-=Serg=-
    Так сказать UP.

    Повторю вопрос:
    Пример пожалуйста в студию вызова динамически загружаемой библиотеки из скрипта и также какие "нужные функции" нужно для этого зарегистрировать в FS.
  • отредактировано 05:50
    В скрипте можно только загрузить dll, но вызывать ее ф-и нельзя (невозможно в принципе).
  • отредактировано 05:50
    В принципе сделать можно, но т.к. идет прямая работа с стеком и невозможно проверить колиество параметров и их тип, то при ошибке в скрипте "упадет" все приложение.
    unit Functions;
    
    interface
    
    implementation
    
    
    uses
      Windows, Classes, fs_iinterpreter,SysUtils,Variants,dialogs
    {$IFDEF Delphi6}
    , Variants
    {$ENDIF};
    
    
    
    type
      TFunctions = class(TfsRTTIModule)
      private
        FAScript:TfsScript;
        function CallMethod(Instance: TObject; ClassType: TClass;
        const MethodName: String; var Params: Variant): Variant;
      protected
        { Protected declarations }
      public
        constructor Create(AScript: TfsScript); override;
        destructor Destroy;override;
      published
        { Published declarations }
      end;
    
    
      
    procedure Register;
    begin
      RegisterComponents('FastScript', [TComponentClass(TFunctions)]);
    end;
    
    constructor TFunctions.Create(AScript: TfsScript);
    begin
      inherited Create(AScript);
      FAScript := AScript;
      with AScript do
      begin
        AddMethod('function LoadLibrary(LibName:String):Integer',CallMethod);
       { AddMethod('procedure AddPrototype(LibHandle:integer;FunctionName:String;FullPrototape:String)',CallMethod);}
        AddMethod('function FreeLibrary(LibHandle:Integer):Boolean',CallMethod);
        AddMethod('function CallFunction(LibHandle:integer;FunctionName:String;Count:Integer;Params:array of variant):variant',CallMethod);
      end;
    end;
    
    function TFunctions.CallMethod(Instance: TObject; ClassType: TClass;
        const MethodName: String; var Params: Variant): Variant;
    var
      LibHandle:Pointer;
      Count:Integer;
      Par:array of Pointer;
      List:variant;
      i:integer;
      Res:Integer;
    begin
      Result := 0;
      if MethodName = 'LOADLIBRARY' then
        begin
          Result := LoadLibrary(PAnsiChar(VarToStr(Params[0])));
        end
      else if MethodName = 'CALLFUNCTION' then
        begin
          LibHAndle := nil;
          LibHandle := GetProcAddress(Cardinal(Params[0]),PAnsiChar(VarToStr(Params[1])));
          if LibHandle <> nil then
            begin
              Count := Params[2];
              GetMem(par,sizeof(Pointer)*Count);
              List := VarArrayRef(Params[3]);
              for i:= 0 to count -1 do
                Par[i]  := FindVarData(VarArrayRef(List)[i])^.VPointer;
    
                 asm
                   pusha;
                   mov edx,[par]
                   mov ecx, Count;
                   cmp ecx,0
                   jz @@m1;
                   @@loop:
                   dec ecx;
                   mov eax,[edx + ecx*4];
                   push eax;
                   jnz @@loop;
                   @@m1:
                   call LibHandle;
                   mov Res,eax;
                   popa;
                 end;
                 FreeMem(par,sizeof(Pointer)*Count);
                 List := 0;
                 Result := Res;
            end;
        end
        else if MethodName = 'FREELIBRARY' then
          Result := FreeLibrary(Params[0]);
    end;
    
    
    initialization
      fsRTTIModules.Add(TFunctions);
    end.
    
    

    Скрипт
    var
    lib,Lib1:Integer;
    Res:variant;
    ar:array of variant;
    begin
    lib := loadLibrary('User32.dll');
    lib1 := loadLibrary('GDI32.dll');
    Res := CallFunction(lib,'MessageBoxW',4,[nil,'Text1','text2',0]);
    Res := CallFunction(lib,'GetDC',1,[0]);
    CallFunction(lib1,'LineTo',3,[Res,100,100]);
    CallFunction(lib,'ReleaseDC',2,[0,Res]);
    FreeLibrary(lib);
    FreeLibrary(lib1);
    end.
    

Оставить комментарий

Многофункциональный текстовый редактор. Чтобы отредактировать стиль параграфа, нажмите TAB, чтобы перейти к меню абзаца. Там вы можете выбрать стиль. По умолчанию не выбран ни один стиль. Когда вы выберете текст, появится встроенное меню форматирования. Нажмите TAB, чтобы войти в него. Некоторые элементы, такие как многофункциональные вставки ссылок, картинок, индикаторов загрузки и сообщений об ошибок могут быть вставлены в редактор. Вы можете перемещаться по ним, используя стрелки внутри редактора и удалять с помощью клавиш delete или backspace.