AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Delphi DLL erstelt mit D10.4 Community, Aufruf in D2006 Zugriffsverletzung
Thema durchsuchen
Ansicht
Themen-Optionen

DLL erstelt mit D10.4 Community, Aufruf in D2006 Zugriffsverletzung

Ein Thema von Michael Habbe · begonnen am 21. Apr 2022 · letzter Beitrag vom 21. Apr 2022
 
Benutzerbild von Michael Habbe
Michael Habbe

Registriert seit: 10. Aug 2005
264 Beiträge
 
Turbo Delphi für Win32
 
#1

DLL erstelt mit D10.4 Community, Aufruf in D2006 Zugriffsverletzung

  Alt 21. Apr 2022, 12:09
Hallo zusammen.

In diesem Thread (https://www.delphipraxis.net/203147-...er-delphi.html) hat Redeemer eine superkompakte Klasse für die Erstellung von QR-Codes erstellt.

Die wollte ich nach einem Test mit Delphi 10.4 Community nach Turbo Delphi portieren, stieß da aber auf einige Probleme u.a. bzgl. pngimage (was ich mit etwas Aufwand beheben konnte). Aber nach delphi 2006 sind zu viele Änderungen erfolgt.

Nach einigen Versuchen habe ich mir dann überlegt, eine DLL mit D10.4C zu erstellen, um sie dann in Delphi 2006 zu laden und den QR-Code per Bitmap zu übertragen.

Die DLL mit Delphi 10.4 Community:
Delphi-Quellcode:
library GiroCode;

uses
// ShareMem,
  System.SysUtils,
  System.Classes,
  Graphics, ExtCtrls,
  RedeemerQR in '..\..\..\BorlandDelphiKomponenten\RedeemerQR\RedeemerQR.pas',
  RedeemerInheritablePNG in '..\..\..\BorlandDelphiKomponenten\RedeemerQR\RedeemerInheritablePNG.pas';

{$R *.res}

type
  TTextGiroCode = array [1..12] of ShortString;

function GenerateCode(GC: TTextGiroCode; var QRbmp: TBitmap): Integer;
var
  QR: TRedeemerQR;
  GC_Text: String;
  i: Integer;
begin
  result := 0;
  GC_Text := '';
  for i := 1 to 11 do
    GC_Text := GC_Text + GC[i] + #13;
  GC_Text := GC_Text + GC[12];

  QR := TRedeemerQR.Create();
  try
    QR.LoadFromString(AnsiString(GC_Text), ecMedium);

// hier kommt es zur Zugriffsverletzung
    QRbmp.Width := QR.Width + 2;
// auch, wenn Height vor Width steht
    QRbmp.Height := QR.Height + 2;

    QRbmp.Canvas.Draw(1,1, QR);
    result := 1;
  finally
    QR.Free;
  end;
end;

exports
  GenerateCode index 1;

begin
end.

Der Aufruf aus Delphi 2006 (in D10.4C sieht die Unit genauso aus):
Delphi-Quellcode:
[...]
type
  TTextGiroCode = array [1..12] of ShortString;

{$R *.dfm}

procedure TForm1.Button3Click(Sender: TObject);
var
  FuncCall: function(GC: TTextGiroCode; var QRbmp: TBitmap): Integer;
  DllHandle: THandle;
  text: TTextGiroCode;
  i: Integer;
  bmp: TBitmap;
begin
  DllHandle := loadlibrary('GiroCode.dll');
  if DllHandle = 0 then
  begin
    ShowMessage('DLL-Ladefehler: GiroCode.dll nicht gefunden!');
    Exit;
  end;

  @FuncCall := getprocaddress(DllHandle, 'GenerateCode');
  if (@FuncCall = Nil) then
    ShowMessage('GetProcAddress-Fehler: GiroCode.dll enthält keine Function "GenerateCode"')
  else
  begin
    for i := 1 to 12 do
      text[i] := Memo1.Lines[i-1];
    bmp := TBitmap.Create;
    bmp.Width := 0;
    bmp.Height := 0;
    FuncCall(text, bmp);
    image1.Picture.Assign(bmp);
    //bmp.SaveToFile('qr.png');
  end;
  FreeLibrary(DLLHandle);
end;
Bei Aufruf der DLL aus D10.4C ist alles in Ordnung und der QR-Code wird angezeigt.
Wenn nun die DLL aus Delphi2006 aufgerufen wird, kommt es inzu einer Zugriffsverletzung an der Stelle, wo QRbmp.Width zugewiesen wird. Eine Auswertung der Variablen ergibt, dass diverse Eigenschaften nicht verfügbar sind.
Kann mir jemand helfen und verraten, wo mein Fehler liegt???

PS: Die Verwendung von "sharemem" oder nicht bringt keinen Unterschied.

Danke
Michael
  Mit Zitat antworten Zitat
 

 

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:30 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz