Events aus DLL

Für alles, was in den übrigen Lazarusthemen keinen Platz, aber mit Lazarus zutun hat.
Antworten
hematec
Beiträge: 1
Registriert: Mo 28. Apr 2008, 17:11

Events aus DLL

Beitrag von hematec »

Hallo,
ich bin ein absoluter Frischling, was FP bzw. Delphi angeht (hab bisher nur VB geprogt) - daher seid bitte ein wenig nachsichtig.

Ich möchte muß in meinem Programm ein dll verwenden, die eine Schnittstelle zu einen Barcodescanner bildet.
Diese DLL stellt procedures und events zur Verfügung.
Nun meine simple Frage - Wie kann ich die DLL entsprechend einbinden, das die Events ankommen?

Hier ein Beispielcode f. C# bzw VB.Net

C#

Code: Alles auswählen

using USICF;
 
public class Form1 : System.Windows.Forms.Form
{
	................
 
private USIClass myUSI;
 
public Form1()
{
//
	// Required for Windows Form Designer support
	//
	InitializeComponent();
 
	//
// TODO: Add any constructor code after //InitializeComponent call
	//
	myUSI = new USIClass(this);
myUSI.DataReady += new USIClass.USIEventHandler(myUSI_DataReady);
myUSI.ErrorEvent += new USIClass.ErrorEventHandler(myUSI_ErrorEvent);
 
}
 
private void myUSI_DataReady(object sender, USIEventArgs e)
{
MessageBox.Show(e.BarcodeData);
}
 
private void myUSI_ErrorEvent(object sender, ErrorEventArgs e)
	{
MessageBox.Show(e.ErrorInfo, "USI Error", MessageBoxButtons.OK, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1);
	}
 
	.........................
}
VB

Code: Alles auswählen

Imports USICF
 
Public Class Form1
    	Inherits System.Windows.Forms.Form
................
    	Private WithEvents myUSI As USIClass
 
#Region " Windows Form Designer generated code "
 
    Public Sub New()
 
        MyBase.New()
 
        ‘This call is required by the Windows Form Designer.
        InitializeComponent()
 
‘Add any initialization after the InitializeComponent() ‘call
        myUSI = New USIClass(Me)
 
    End Sub
 
	................
 
#End Region
 
Private Sub myUSI_DataReady(ByVal sender As Object, ByVal e As USIEventArgs) Handles myUSI.DataReady
        MessageBox.Show(e.BarcodeData)
End Sub
 
Private Sub myUSI_ErrorEvent(ByVal sender As Object, ByVal e As ErrorEventArgs) Handles myUSI.ErrorEvent
MessageBox.Show(e.ErrorInfo, "USI Error", MessageBoxButtons.OK, MessageBoxIcon.Exclamation, _
        MessageBoxDefaultButton.Button1)
    End Sub
 
	................
 
End Class
Hab hier echt noch totale Verständnissprobs was die Deklarationen in FP angeht.

vielen Dank im Voraus,

hematec

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Beitrag von pluto »

Wenn ich das richtig verstehe hast du schon ein Pascal Header von dieser Datei ?
Wenn ja ist ein Event eigentlich recht einfach zu gewiesen hier mal ein kleines Beispiel:
(Ich nehme jetzt mal an das das so auch bei DLL's geht)

Code: Alles auswählen

type
  TMyEvent = procedure(...) of object // of object ist ganz wichtig dabei
 
 
var 
  ONtest:Tmyevent;
 
procedure Test;
begin
  writeln('ES GEHT PRIMA' !!);
end;
//Jetzt brauchst du nur noch eine stelle wo du das Event zuweist und aufrufen möchtes:
// zuweisung:
onTest:=@test;
 
//aufruf:
onTest
//vohrer sollte nach geschaut werden ob das Event überhaupt belegt ist mit:
if assigned(ontest) then ....
Mit etwas glück geht das auch bei DLLS.
Aber du brauchst natürlich zu erst Pascal Header von den Dateien.
Ich weiß der Code sieht etwas seltsam aus, aber es soll ja auch nur als Beispiel dinen.
MFG
Michael Springwald

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Beitrag von Christian »

Ich sehe in deinen Beispielen keine deklarationen für eine Routine die aus einer dll kommt.

die dürften in USICF zu finden sein ...
Du müsstest also schon etwas mehr Informationen liefern.

Barcodeleser emulieren in 95 % der Fälle eine Tastatur man braucht also gar keine externen Komponenten dafür. Die Barcodeleser kann man so konfigurieren das sie vor und nach dem Scannen eine bestimmte Taste oder Tastenkombi senden. So das du dann den Fokus z.b. auf ein Eingabefeld setzen kannst und die eingaben vom Scanner dann dort landen. Beim Abschluisszeicehn kannst du diese verarbeiten ...

Was Plutos beitrag mit DLL´s zu tun hat kann ich nicht nachvollziehen.
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

Eb
Lazarusforum e. V.
Beiträge: 240
Registriert: Di 5. Feb 2008, 15:32
OS, Lazarus, FPC: Linux Mint - Laz 2.2.0
CPU-Target: 64Bit
Wohnort: Stuttgart

Funktionen aus DLL

Beitrag von Eb »

Hallo,

bin auch Umsteiger von VB.
Ich mache den Zugriff auf den Parallelport über eine Funktion, die eine DLL bereitstellt:
----------------------------------------------------------------
VB6:
Public Declare Function Inp Lib "inpout32.dll" Alias "Inp32" (ByVal PortAddress As Integer) As Integer

Private Sub Timer1_Timer()
wert = Inp(889)
End Sub
---------------------------------------------------------------
Lazarus

Code: Alles auswählen

unit main;
 
{$mode objfpc}{$H+}
 
interface
 
uses
 
type
 
  { Tfrm_main }
 
  Tfrm_main = class(TForm)
    btn_korrektur: TButton;
  ...
 
  private
    { private declarations }
  public
    { public declarations }
  end; 
 
   function Inp32(wAddr:integer):integer; stdcall;
 
implementation
 
    function Inp32(wAddr:integer):integer; stdcall; external 'inpout32.dll';    
 
{ Tfrm_main }
 
procedure Tfrm_main.Timer1Timer(Sender: TObject);
begin
  wert := inp32($379);
end;
Erklären kann ichs nicht, aber es tut ;)

Gruss
Eberhard

creed steiger
Beiträge: 958
Registriert: Mo 11. Sep 2006, 22:56

Beitrag von creed steiger »

Wie Christian schon geschrieben hat,emulieren
die Leser meistens ein Tastatureingabe bzw.übermitteln eine Zahlenfolge.
Mach eine Console auf und scan einen Barcode
dann solltest du eine Zahl sehen(zumindestens bei den Lesern die ich kenne).
So könntest du den Umweg mit der DLL sparen.

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6771
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Beitrag von af0815 »

Frage:
a) Anschluss des Scanners an - Tastaturport, Parallel oder Seriell ?

b) Liegt die Klasse nur als .Net Bibliothek vor oder auch als klassische DLL bzw. COM Objekt. Bzw. gibt es *.h Dateien in den Beispielen (Unter C oder C++ - Beispielen suchen). Manchmal gibt es auch Delphi Beispiele :-)

c) Wenn du bei b nicht sicher bist, dann schreibe, um was für eine Type/Firma es sich handelt. Denn es könnte sein, das der eine oder andere schon damit gearbeitet hat.

Wenn bei b was rauskommt mit den Headern, dann kann man es so deklarieren wie Eb es in dem Beispiel gebracht hat. Es handelt sich hier um die Definition, wie der Einsprung in die DLL erfolgen soll und das ist aussreichen. Das ist ein Beispiel, wo der Compiler zur Designzeit weis, wie er mit der Funktion umgehen soll (Early Binding).

Code: Alles auswählen

function Inp32(wAddr:integer):integer;
Definiert wie die Funktion heisst und welche Parameter es gibt

Code: Alles auswählen

stdcall;
Gibt dem Compiler den Hinweis, wie es sie Aufrufen soll (Reihenfolge der Parameter am Stack, ob der Stack verwendet werden soll oder Register der CPU, wer alles wieder aufräumt)

Code: Alles auswählen

external 'inpout32.dll';
Wo er eigentlich den Einsprung findet. In dem Fall in der genannten DLL. Die wird dann gesucht und verwendet.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Antworten