miércoles, marzo 28, 2007

Usando DLL's hechas en Delphi desde una aplicación C#

Desde el día de ayer he tratado de utilizar una DLL hecha en Turbo Delphi desde una aplicación en C#, ¿por qué? simplemente porque las librerías gráficas se me facilitan más en Delphi, o más sinceramente porque nunca había tenido necesidad de utilizarlas en C#.

La necesidad se basa en una aplicación que capture la imagen de ciertas zonas de la pantalla, el problema que tenía es que al pasar los parámetros de la función no me tomaba los valores correctos, por ejemplo, para la variable X yo le pasaba un valor de 600 y tomaba un entero largo de 135313 que no sabía de donde sacaba, al estar buscando por toda la red me dí cuenta que lo único que me faltaba era agregar la claúsula stdcall al final de la función en Delphi, por tan poca cosa era.

Esta es la función de la DLL en delphi ya modificada:

procedure capturaPantalla(x,y,ar,ab,height,width: integer);stdcall;
var
rectangulo,dest : TRect;
imagen : TBitmap;
lienzo : TCanvas;
h : THandle;
error : integer;
begin
// ShowMessage('x:'+inttostr(x)+#13+'y:'+inttostr(y)+#13+'ar:'+inttostr(ar)+#13+'ab:'+inttostr(ab)+'height:'+inttostr(height)+'width:'+inttostr(width));
error:=28;
lienzo:=TCanvas.Create;
lienzo.Handle:=GetWindowDC(GetDesktopWindow);
h:=GetDesktopWindow;
rectangulo:=Rect(0,0,screen.Width,screen.Height);
if h<>0 then GetWindowRect(h,rectangulo);
dest:=Rect(0,0,width,height);
try
Imagen:= TBitmap.Create;
inc(error); //29
Imagen.Height:=height;//ab-y
inc(error); //30
Imagen.Width:=width;//ar-x;
inc(error); //31
rectangulo:=Rect(x,y,ar,ab);
inc(error); //32
Imagen.Canvas.CopyRect(dest,lienzo,rectangulo);
inc(error); //33
Imagen.SaveToFile('a.jpg');
inc(error); //35
except
on e : exception do
ShowMessage('Error en línea '+inttostr(error)+' : ' + e.Message +' | ' +e.ClassName);
end;
end;


Y así se invocó desde C#

[DllImport("libfgt.dll", EntryPoint = "capturaPantalla")]
public static extern void capturaPantalla(int x, int y, int ar, int ab, int height, int width);

Continuando con mi aplicación de Delphi, me tope con un nuevo dilema, cómo meter un form dentro de la DLL, fácil.

Solo hay que crear el nuevo form dentro del proyecto y únicamente tuve que crearlo dinámicamente dentro de la función:

procedure editaImagen;
var
editor : TForm1;
begin
try
editor := TForm1.Create(Application);
editor.ShowModal;
except
on E : Exception do
ShowMessage('Error: ' + e.Message);
end;
end;


1 comentario:

Anónimo dijo...

He probado a realizar una DLL en Delphi Win32 con un formulario y al utilizarla en C# Visual Studio 2005 en modo Debug da un error de acceso a memoria.

Esto es normal? Le sucede esto a alguien más?

Un saludo.