Как сделать многократный вызов функции из dll?

saleo2000
Дата: 01.10.2004 13:57:09
Многократный вызов функции из dll

Кто делал dll на Delphi, и подключал ее к Oracle....

Ответьте, пож-та, можно ли функцию из dll вызывать для разных значений в пределах одной и тоже оракловой сессии?....

а то у меня не получается (

и если, да, то подскажите, пож-та, как это сделать?
Teo
Дата: 01.10.2004 14:33:03
А в чем, собственно, проблема?
Вот исходничек небольшой либы...
У меня работает без проблем...

library BitLib;

{$R *.res}

function BitAnd(Value1: integer; Value2: Integer): Integer; safecall; cdecl;
var
  r: integer;
begin
  r := Value1 and Value2;
  Result := r;
end;

function BitOr(Value1: integer;  Value2: Integer): Integer; safecall; cdecl;
begin
  Result := Value1 or Value2;
end;

function BitXor(Value1: integer; Value2: Integer): Integer; safecall; cdecl;
begin
  Result := Value1 xor Value2;
end;

function BitNot(Value: Integer): Integer; safecall; cdecl;
begin
  Result := not Value;
end;

function BitShl(Value, Shift: Integer): Integer; safecall; cdecl;
begin
  Result := Value shl Shift;
end;

function BitShr(Value, Shift: Integer): Integer; safecall; cdecl;
begin
  Result := Value shr Shift;
end;

function BitHi(Value: Integer): Smallint; safecall; cdecl;
begin
  Result := Value shr 16;
end;

function BitLo(Value: Integer): Smallint; safecall; cdecl;
begin
  Result := Value and $FFFF;
end;

exports
  BitAnd, BitOr, BitXor, BitNot, BitShl, BitShr, BitHi, BitLo;

begin
  IsMultiThread := True;
end.
---------------
Му-му на самом деле был кобелём. А вот сукой оказася Герасим...
saleo2000
Дата: 01.10.2004 15:46:58
У меня сделано через OCI.

Как в примере в Delphi по DOA:

library dept;

uses

  SysUtils,

  Oracle,

  DeptDataModuleUnit in 'DeptDataModuleUnit.pas';

var

  // The saved exit procedure

  SaveExit: Pointer;

  // The data module with a session and a query

  DataModule: TDeptDataModule = nil;

  // The OCI number result for the EmpCount function

  EmpCountResult: TOCINumber = nil;

// Count the number of employees in the given department

function EmpCount(Context: Pointer; p_DeptNo: TOCINumber): TOCINumber; cdecl;

var

  DeptNo: Integer;

begin

  Result := nil;

  with DataModule do

  try

    // Share the session of the caller with the TOracleSession

    Session.ExtProcShare(Context);

    // Convert the OCI number to a plain integer and set the variable

    DeptNo := Session.OCINumberToInt(p_DeptNo);

    EmpCountQuery.SetVariable('deptno', DeptNo);

    // Execute the query that counts the employees

    EmpCountQuery.Execute;

    // Allocate an OCI number for the result if necessary

    if EmpCountResult = nil then

      EmpCountResult := Session.OCINumberCreate;

    Result := EmpCountResult;

    // Get the count from the result set

    Session.OCINumberFromInt(Result, EmpCountQuery.Field('empcount'));

  except

    // Translate all Delphi exceptions to Oracle exceptions

    on E: EOracleError do

      Session.ExtProcRaise(E.ErrorCode, E.Message);

    on E: Exception do

      Session.ExtProcRaise(20000, E.Message);

  end;

end;

// Free all preserved resources when the DLL is unloaded

procedure LibExit;

begin

  if EmpCountResult <> nil then

    DataModule.Session.OCINumberFree(EmpCountResult);

  DataModule.Free;

  // Restore the exit procedure

  ExitProc := SaveExit;

end;

// Export the EmpCount function

exports

  EmpCount;

begin

  // Create the data module when the DLL is loaded

  DataModule := TDeptDataModule.Create(nil);

  // Save and override the exit procedure

  SaveExit := ExitProc;

  ExitProc := @LibExit;

end.


Вот, все сделано как в help. Только функция другая :)....
Ну так вот, эту функцию мне надо будет в пределах одной оракловой сессии выполнять для разных значений.

В Oracle эта функция объявлена по типу того:


create or replace

  function EmpCount(p_DeptNo in dept.deptno%type) 

  return number 

  as external language c

  name "EmpCount"

  library DeptLib

  with context;


а хочу вызывать эту функцию в цикле для разных отделов.

ну у меня для первого значения отрабатывает, а для всех остальных - нет
saleo2000
Дата: 04.10.2004 17:58:59
Неужели такой вопрос, что никто не хочет отвечать?

Или наоборот, слишком легкий???
saleo2000
Дата: 04.10.2004 18:20:45
ЛЮ-Ю-Ю-Ю-Ю-ДИ!!!!


ПОМОГИТЕ!!! ОЧЕНЬ НАДО!!!
Petro123
Дата: 04.10.2004 18:40:33
Ты бы хоть писал, что Oracl :).
Его не знаю.
Teo
Дата: 04.10.2004 18:50:56
А на что ругается?
---------------
Му-му на самом деле был кобелём. А вот сукой оказася Герасим...
saleo2000
Дата: 05.10.2004 11:23:45
Teo
А на что ругается?
---------------
Му-му на самом деле был кобелём. А вот сукой оказася Герасим...



Да не на что не ругается, просто не выполняет функцию для другого параметра.

Teo, скажите, пож-та, если вы делали что-то подобное (dll - Delphi-Oracle).
то как вы использовали свою функцию в dll? многократно в одной оракловой сессии?

или вызывали ее только один раз?
Teo
Дата: 05.10.2004 11:53:09
Я же выше выкладывал исходник своего модуля, который работает как часы...
И не важно, сколко раз вызывать функцию...
Единственное но... у меня Oracle 8.1.7...
Да, еще одно...
Когда писался этот модуль, он тоже не хотел очень долго работать...
LOST RPC.... и т.д....
Все вылечилось добавлением к объявлению cdecl директивы safecall...
После этого проблема исчезла...
---------------
Му-му на самом деле был кобелём. А вот сукой оказася Герасим...
saleo2000
Дата: 05.10.2004 12:03:54
Teo
Я же выше выкладывал исходник своего модуля, который работает как часы...
И не важно, сколко раз вызывать функцию...
Единственное но... у меня Oracle 8.1.7...
Да, еще одно...
Когда писался этот модуль, он тоже не хотел очень долго работать...
LOST RPC.... и т.д....
Все вылечилось добавлением к объявлению cdecl директивы safecall...
После этого проблема исчезла...
---------------
Му-му на самом деле был кобелём. А вот сукой оказася Герасим...



По-моему, вы не используете OCI?

А я использую...и у меня все примерно так как, как в примере в help. Код был опубликован мною. Мне кажется, есть разница в вашем и моем методе?

Вы так же создаете библиотеку на Pl\SQL и описываете функции?

или используете пакет ora_ffi для доступа к функциям из dll?