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' ,
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
Almacen.Free;
end;
end;
exports
Requiero;
begin
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
public
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' ;
{$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
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.