Ver Mensaje Individual
  #1  
Antiguo 07-11-2010
mamaro mamaro is offline
Miembro
 
Registrado: mar 2004
Posts: 79
Reputación: 21
mamaro Va por buen camino
Problema con módulo web y conexiones ADO dentro de una DLL

Buenas compañeros foreros, les cuento mi problema

La Situación: hice una DLL que hace un reporte según unos parámetros que se le proporcionan, la librería exporta una función que recibe como parámetro único un string (lo recibo en PChar) y devuelvo otro (de la misma forma PChar). Esta DLL funciona bien en aplicaciones de escritorio, pero en un módulo para Apache que necesito hacer me devuelve un error EOleSysError.

El Código

La DLL
Código Delphi [-]
library run;

uses
  SysUtils,
  Classes,
  UAlmacen in '..\UAlmacen.pas' {Almacen: TDataModule},
  UContenido in '..\UContenido.pas',
  UDatos in '..\UDatos.pas';

{$R *.res}

function Requiero(Pedido:PChar):PChar stdcall; export;
var Contenido : TContenido;
    Almacen : TAlmacen;
    respuesta : string;
begin
  Contenido := TContenido.Create;
  Almacen := TAlmacen.Create(nil);
  try
    Contenido.Almacen := Almacen;
    Contenido.pedido := Pedido;
    respuesta := contenido.respuesta;
    result := PChar(respuesta);
  finally
    //Contenido.Free;
    Almacen.Free;
  end;
end;

exports
  Requiero;

begin
  // Código de inicialización
end.

Una de las aplicaciones "standalone" que funcionan bien
Código Delphi [-]
unit UPrincipal;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, OleCtrls, SHDocVw, StdCtrls, ExtCtrls;

type
  TForm1 = class(TForm)
    WebBrowser1: TWebBrowser;
    Memo1: TMemo;
    Panel1: TPanel;
    Label1: TLabel;
    Button1: TButton;
    Splitter1: TSplitter;
    edit1: TComboBox;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

function Requiero(pedido:PChar):PChar stdcall; external 'C:\Program Files (x86)\Apache Group\Apache2\modules\run.dll' name 'Requiero';

procedure TForm1.Button1Click(Sender: TObject);
var aux : string;
    arch : TStringList;
begin
  arch := TStringList.Create;
  try
    aux := Requiero(PChar(edit1.Text));
    arch.Text := aux;
    arch.SaveToFile('Respuesta.htm');
    WebBrowser1.Navigate('..\run!\prueba run\Respuesta.htm');
  finally
    arch.Free;
  end;
end;

end.

El módulo que no funciona
El Proyecto
Código Delphi [-]
library rDyn;

uses
  WebBroker,
  ApacheTwoApp,
  UCentral in 'UCentral.pas' {WebModule1: TWebModule};

{$R *.res}

{$E so}
{$LIBPREFIX 'mod_'}

exports
  apache_module name 'rDyn_module';

begin
  Application.Initialize;
  Application.CreateForm(TWebModule1, WebModule1);
  Application.Run;
end.

El Web Module
Código Delphi [-]
unit UCentral;

interface

uses
  SysUtils, Classes, HTTPApp;

type
  TWebModule1 = class(TWebModule)
    procedure WebModule1runAction(Sender: TObject; Request: TWebRequest;
      Response: TWebResponse; var Handled: Boolean);
  private
  public
    { Public declarations }
  end;

  function Requerimiento(Pedido:PChar):PChar;stdcall; external 'run.dll' name 'Requiero';

var
  WebModule1: TWebModule1;

implementation

uses UContenido;

{$R *.dfm}

procedure TWebModule1.WebModule1runAction(Sender: TObject; Request: TWebRequest;
  Response: TWebResponse; var Handled: Boolean);
var aux,aux2:string;
begin
  aux2 := Request.Query;
  aux:=Requerimiento(PChar(aux2));
  Response.Content := aux;
end;

end.

Esto lo agregué en la configuración de Apache (httpd.conf)
Código:
LoadModule rDyn_module modules/mod_rDyn.so
<Location /rDyn>
  SetHandler mod_rdyn-handler
</Location>
El error que me da


Googleando me encontré que varios tienen el mismo problema (DLL que se conectan a BD mediante ADO y que funcionan en un exe pero no en un módulo web), pero ninguno proporciona una solución.

Utilizo conexiones ADO y Firebird ODBC Driver v2.0
Windows 7 (64 bits) - Delphi 2010 - Firebird 2.5 (x64)

Perdón por el tocho-post pero quería ser bien específico.
Responder Con Cita