Что нового

Использование IBEScript.dll в своей программе

alroy

Новичок
Сообщения
9
Репутация
0
Хотел использовать IBEScript.dll но не совсем понимаю с чего нужно начинать сама библиотека нужна для выполнения скриптов sql и других действий с базой Firebird. Самый главный вопрос ее вообще можно использовать с autoit или нет

о самой библиотеке узнал вот такую информацию:

Function Name Index Relative Address Size
=================================================
ExecScriptFile 3 0x003EF9A0 100
ExecScriptText 5 0x003EFA04 148
ExecScriptFile2 4 0x003EFA98 112
ExecScriptText2 6 0x003EFB08 160
Connect 1 0x003EFBA8 1212
Disconnect 2 0x003F0064 168
InitLicense 7 0x003F010C 0

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

сначала подключаем библиотеку
Код:
$hDLL = DllOpen("IBEScript.dll")

потом используя функцию Connect из библиотеки цепляемся к базе
далее используя функцию ExecScriptFile или ExecScriptFile2 (не знаю разницы) выполняю скрипт
ну и далее отключение от базы используя функцию Disconnect
как то вот так.


P.S. у меня есть пример для делфи но в нем я не понимаю
 

firex

AutoIT Гуру
Сообщения
943
Репутация
208
Не нашел нормальной документации и не крепил обработку CallBack'ов, поэтому как то так:
Код:
$hIBE = _IBEScript_Open()
_IBEScript_Connect( $hIBE, "db_name=localhost:c:\empty.fdb; password=masterkey; user_name=SYSDBA; " & _
	'lc_ctype=win1251; sql_role_name=ADMIN; sql_dialect=3; clientlib="c:\program files\firebird\bin\fbclient.dll"' )

_IBEScript_ExecuteScriptFile( ... )
_IBEScript_Close( $hIBE )




Func _IBEScript_Open( $sDllPath = "IBEScript.dll" )
	Local $hDll = DllOpen( $sDllPath )
	; ---
	Return SetError( ( $hDll = -1 ), 0, $hDll )
EndFunc

Func _IBEScript_Connect( $hIBE, $sConnectString )
	Local $aRet = DllCall( $hIBE, "int", "Connect", "str", $sConnectString, "int", 0 )
	; ---
	Return SetError( @Error, 0, ( Not @Error And $aRet[0] = 0 ) )
EndFunc

Func _IBEScript_ExecuteScriptFile( $hIBE, $sFilePath )
	Local $aRet = DllCall( $hIBE, "int", "ExecuteScriptFile", "str", $sFilePath, "int", 0, "int", 0, "int", 0 )
	; ---
	Return True ;?
EndFunc

Func _IBEScript_Close( $hIBE )
	DllClose( $hIBE )
	; ---
	Return True
EndFunc
 
Автор
A

alroy

Новичок
Сообщения
9
Репутация
0
спасибо буду разбираться (пока не получаеться)
 

firex

AutoIT Гуру
Сообщения
943
Репутация
208
alroy
Обновил пост, что то меня было переклинило с SetError, теперь должно работать.
 
Автор
A

alroy

Новичок
Сообщения
9
Репутация
0
firex
Никак не получается разобраться и самое интересное и ошибок не выдает и скрипт на базу не выпоняется!!
если поможет то вот пример с делфи:
Код:
unit uTestDLL;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, ExtCtrls, ComCtrls, cxControls, cxContainer, cxShellTreeView,
  cxShellListView;

type
  TForm1 = class(TForm)
    Pages: TPageControl;
    TabSheet1: TTabSheet;
    TabSheet2: TTabSheet;
    tsOutput: TTabSheet;
    mLog: TMemo;
    fne: TEdit;
    Button1: TButton;
    mScript: TMemo;
    Label1: TLabel;
    Panel1: TPanel;
    Button2: TButton;
    Label2: TLabel;
    tsExec2: TTabSheet;
    Panel2: TPanel;
    Label3: TLabel;
    Memo1: TMemo;
    Button3: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
  private

  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  StmtCount : integer;
  ErrCount : integer;

type

  TConnectErrorCallbackFunc = function (AErrorMessage : PChar) : integer;  stdcall;
  TScriptErrorCallbackFunc = function (AStmtText, AErrMessage : PChar) : integer; stdcall;
  TScriptBeforeExecStatementFunc = function (AStmtText, AText : PChar) : integer; stdcall;
  TScriptAfterExecStatementFunc = function (AStmtText : PChar; Success : integer) : integer; stdcall;
  TScriptIBEBlockProgressFunc = function (AProgressMessage : PChar) : integer; stdcall;

  TExecuteScriptProc = procedure (AScriptFile : PChar;
                                  AErrorCallbackFunc : TScriptErrorCallbackFunc;
                                  ABeforeCallbackFunc : TScriptBeforeExecStatementFunc;
                                  AAfterCallbackFunc : TScriptAfterExecStatementFunc); stdcall;

  TExecuteScriptProc2 = procedure (AScriptFile : PChar;
                                  AErrorCallbackFunc : TScriptErrorCallbackFunc;
                                  ABeforeCallbackFunc : TScriptBeforeExecStatementFunc;
                                  AAfterCallbackFunc : TScriptAfterExecStatementFunc;
                                  AIBEBlockProgressFunc : TScriptIBEBlockProgressFunc); stdcall;

  TConnectDBProc = function (AConnectParams : PChar;
                             AConnectErrorCallbacFunc : TConnectErrorCallbackFunc) : integer; stdcall;


function HandleError(AStmtText, AErrMessage : PChar) : integer; stdcall;
function BeforeExec(AStmtText, AText : PChar) : integer; stdcall;
function AfterExec(AStmtText : PChar; Success : integer) : integer; stdcall;
function BlockProgress(AProgress : PChar) : integer; stdcall;
function CEH(AErrorMessage : PChar) : integer;  stdcall;

implementation

{$R *.DFM}

function BlockProgress(AProgress : PChar) : integer; stdcall;
begin
  Application.MainForm.Caption := AProgress;
  Application.ProcessMessages;
end;

function HandleError(AStmtText, AErrMessage : PChar) : integer; stdcall;
begin
  Result := 0;
  Inc(ErrCount);
  Form1.mLog.Lines.Add('------- STATEMENT --------');
  Form1.mLog.Lines.Add(AStmtText);
  Form1.mLog.Lines.Add('-------   ERROR   --------');
  Form1.mLog.Lines.Add(AErrMessage);
end;

function BeforeExec(AStmtText, AText : PChar) : integer; stdcall;
begin
  Result := 0;
  Form1.mLog.Lines.Add(AText);
end;

function AfterExec(AStmtText : PChar; Success : integer) : integer; stdcall;
begin
  Result := 0;
  if Success = 1 then
    Inc(StmtCount)
  else
    Result := 1; // Abort script execution
end;

function CEH(AErrorMessage : PChar) : integer;  stdcall;
begin
  ShowMessage(AErrorMessage);
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  Hndl : THandle;
  ESP : TExecuteScriptProc;
begin
  ErrCount := 0;
  StmtCount := 0;
  mLog.Lines.Clear;
  if Trim(fne.Text) = '' then
  begin
    ShowMessage('Script file is not specified!');
    Exit;
  end;
  if not FileExists(Trim(fne.Text)) then
  begin
    ShowMessage('File doesn''t exist!');
    Exit;
  end;
  Hndl := LoadLibrary(PChar('IBEScript.exe'));
  try
    if (Hndl > HINSTANCE_ERROR) then
    begin
      ESP := GetProcAddress(Hndl, 'ExecScriptFile');
      if @ESP <> nil then
      begin
        Pages.ActivePage := tsOutput;
        ESP(PChar(fne.Text), @HandleError, @BeforeExec, @AfterExec);
      end;
    end;
  finally
    if Hndl > HINSTANCE_ERROR then
      FreeLibrary(Hndl);
  end;
end;

procedure TForm1.Button2Click(Sender: TObject);
var
  Hndl : THandle;
  ESP : TExecuteScriptProc;
  s : string;
  Res : integer;
begin
  ErrCount := 0;
  StmtCount := 0;
  mLog.Lines.Clear;
  s := mScript.Text;
  if Trim(s) = '' then
  begin
    ShowMessage('Nothing to do!');
    Exit;
  end;
  try
    Hndl := LoadLibrary(PChar('IBEScript.dll'));
    if (Hndl > HINSTANCE_ERROR) then
    begin
      ESP := GetProcAddress(Hndl, 'ExecScriptText');
      if @ESP <> nil then
      begin
        Pages.ActivePage := tsOutput;
        ESP(PChar(s), @HandleError, @BeforeExec, @AfterExec);
      end;
    end;
  finally
    if Hndl > HINSTANCE_ERROR then
      FreeLibrary(Hndl);
  end;
end;

procedure TForm1.Button3Click(Sender: TObject);
var
  Hndl : THandle;
  ESP : TExecuteScriptProc2;
  s : string;
  Res : integer;
begin
  ErrCount := 0;
  StmtCount := 0;
  mLog.Lines.Clear;
  s := Memo1.Text;
  if Trim(s) = '' then
  begin
    ShowMessage('Nothing to do!');
    Exit;
  end;
  try
    Hndl := LoadLibrary(PChar('IBEScript.dll'));
    if (Hndl > HINSTANCE_ERROR) then
    begin
      ESP := GetProcAddress(Hndl, 'ExecScriptText2');
      if @ESP <> nil then
      begin
        Pages.ActivePage := tsOutput;
        ESP(PChar(s), @HandleError, @BeforeExec, @AfterExec, @BlockProgress);
      end;
    end;
  finally
    if Hndl > HINSTANCE_ERROR then
      FreeLibrary(Hndl);
  end;
end;
end.
 
Верх