Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Otros entornos y lenguajes > Lazarus, FreePascal, Kylix, etc.
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 15-07-2015
rmostalac rmostalac is offline
Miembro
 
Registrado: jul 2004
Ubicación: Texcoco, México
Posts: 3
Poder: 0
rmostalac Va por buen camino
Al accesar un Bitmap en DLL se genera ACCESS VIOLATION

Despues de ejecutar Bitmap := TBitmap.Create; verifico que Bitmap no sea NIL, pero al tratar de establecer el tamaño con Bitmap.Setsize(29,29); recibo el error ACCESS VIOLATION.

El mismo código en una Aplicación de escritorio funciona correctamente!

¿Alguien podrá darme un "empujoncito" para poder resolver el problema?
Responder Con Cita
  #2  
Antiguo 16-07-2015
Avatar de ElKurgan
[ElKurgan] ElKurgan is offline
Miembro Premium
 
Registrado: nov 2005
Posts: 1.235
Poder: 20
ElKurgan Va camino a la fama
Pues hombre, sin ver nada más del código y con la información que proporcionas, es difícil poder ayudarte.

¿Intentas acceder a un Bitmap en una DLL? ¿Quieres devolver el Bitmap a un programa desde una DLL? ¿Le pasas el Bitmap a la DLL como parámetro?

Hay un dicho en este grupo que dice que hay que tomarse un tiempo para plantear una pregunta, porque contra mejor esté planteada, más fácil es de responder

Saludos
Responder Con Cita
  #3  
Antiguo 16-07-2015
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.093
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Como bien dice ElKurgan, léete nuestra guía de estilo, gracias
Responder Con Cita
  #4  
Antiguo 16-07-2015
rmostalac rmostalac is offline
Miembro
 
Registrado: jul 2004
Ubicación: Texcoco, México
Posts: 3
Poder: 0
rmostalac Va por buen camino
Código referido

El código de la DLL es el siguiente:

La instrucción en BOLD señala en donde ocurre el ACCESS VIOLATION. Si quito cualquier referncia al Bitmap no se genera error en la DLL. Este mismo código funciona perfectamente bien en una aplicación de escritorio.


Código Delphi [-]
library QRCodeLibDinPrj;
 
 
uses
  Windows, Classes, Graphics, QRCodeUnit
  { you can add units after this };
 
 
function GetQRCodeImagen(Text: Pchar; Codificacion, ZonaSegura: Integer): HBitmap; export; stdcall;
var
  QRCodeBitmap: TBitmap;
  QRCode: TRAMLQRCode;
  Row, Column: Integer;
begin
  QRCodeBitmap := TBitmap.Create;
  QRCode := TRAMLQRCode.Create;
  try
    QRCode.Data := Text;
    QRCode.Encoding := TQRCodeEncoding(Codificacion);
    QRCode.QuietZone := ZonaSegura;
 
    QRCodeBitmap.SetSize(QRCode.Rows, QRCode.Columns);
 
    for Row := 0 to QRCode.Rows - 1 do
    begin
      for Column := 0 to QRCode.Columns - 1 do
      begin
        if (QRCode.IsBlack[Row, Column]) then
        begin
          QRCodeBitmap.Canvas.Pixels[Column, Row] := clBlack;
        end else
        begin
          QRCodeBitmap.Canvas.Pixels[Column, Row] := clWhite;
        end;
      end;
    end;
    Result := Bitmap.ReleaseHandle;
  finally
    QRCode.Free;
    QRCodeBitmap.Free;
  end;
end;
 
 
exports GetQRCodeImagen;
 
 
begin
end.


El programa que consume la DLL es el siguiente:

Código Delphi [-]
unit qrcodedll;
 
 
{$mode objfpc}{$H+}
 
 
interface
 
 
uses
  Windows, Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls,
  ExtCtrls;
 
 
type
 
 
  { TQRCodeDLLForm }
 
 
  TQRCodeDLLForm = class(TForm)
    ComboBox1: TComboBox;
    Edit1: TEdit;
    Edit2: TEdit;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    PaintBox1: TPaintBox;
    procedure ComboBox1Change(Sender: TObject);
    procedure Edit1Change(Sender: TObject);
    procedure Edit2Change(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure PaintBox1Paint(Sender: TObject);
  private
    { private declarations }
    QRCodeBitmap: TBitmap;
  public
    { public declarations }
    procedure Update; override;
  end;
 
 
 
 
var
  QRCodeDLLForm: TQRCodeDLLForm;
 
 
  function GetQRCodeImagen(Text: Pchar; Codificacion, ZonaSegura: Integer): HBitmap;
           stdcall; external 'QRCodeLibDinPrj.dll';
 
 
implementation
 
 
{$R *.lfm}
 
 
{ TQRCodeDLLForm }
 
 
procedure TQRCodeDLLForm.Edit1Change(Sender: TObject);
begin
  Update;
end;
 
 
procedure TQRCodeDLLForm.Edit2Change(Sender: TObject);
begin
  Update;
end;
 
 
procedure TQRCodeDLLForm.ComboBox1Change(Sender: TObject);
begin
  Update;
end;
 
 
procedure TQRCodeDLLForm.FormCreate(Sender: TObject);
begin
  QRCodeBitmap := TBitmap.Create;
  Update;
end;
 
 
procedure TQRCodeDLLForm.FormDestroy(Sender: TObject);
begin
  QRCodeBitmap.Free;
end;
 
 
procedure TQRCodeDLLForm.PaintBox1Paint(Sender: TObject);
var
  Scale: Double;
begin
  PaintBox1.Canvas.Brush.Color := clWhite;
  PaintBox1.Canvas.FillRect(Rect(0, 0, PaintBox1.Width, PaintBox1.Height));
  if ((QRCodeBitmap.Width > 0) and (QRCodeBitmap.Height > 0)) then
  begin
    if (PaintBox1.Width < PaintBox1.Height) then
    begin
      Scale := PaintBox1.Width / QRCodeBitmap.Width;
    end else
    begin
      Scale := PaintBox1.Height / QRCodeBitmap.Height;
    end;
    PaintBox1.Canvas.StretchDraw(Rect(0, 0, Trunc(Scale * QRCodeBitmap.Width), Trunc(Scale * QRCodeBitmap.Height)), QRCodeBitmap);
  end;
end;
 
 
procedure TQRCodeDLLForm.Update;
begin
  QRCodeBitmap.Handle := GetQRCodeImagen(PChar(Edit1.Text), ComboBox1.ItemIndex, StrToIntDef(Edit2.Text, 4));
  PaintBox1.Repaint;
end;
 
 
end.

Espero que alguien pueda darme luz de como resolver el problema!
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
accesar a funciones de usuarios en modulos de ms access Chogo Tablas planas 5 13-10-2012 00:52:08
Access violation jocaro Varios 6 30-12-2011 18:42:06
Access violation con una DLL de C johan Varios 3 15-11-2007 15:45:40
Access Violation con DLL emeceuy Varios 8 17-08-2007 21:57:55
Access Violation ..... MADV01 Varios 2 24-03-2004 16:01:33


La franja horaria es GMT +2. Ahora son las 00:13:02.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi