AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Dlls benutzen

Ein Thema von mimi · begonnen am 2. Apr 2006 · letzter Beitrag vom 2. Apr 2006
Antwort Antwort
mimi

Registriert seit: 1. Dez 2002
Ort: Oldenburg(Oldenburg)
2.008 Beiträge
 
FreePascal / Lazarus
 
#1

Dlls benutzen

  Alt 2. Apr 2006, 11:50
Hallo,
ich habe heute angefangen eine eigne DLL zu schreiben sie sieht im moment genau so aus:
Delphi-Quellcode:
library myStringListDll;


uses
  SysUtils,Classes,dialogs;

{$R *.res}
procedure GibtNachricht_Aus(Str:Pchar); external 'myStringListDll.dllindex 1;

type
  TTest = class
  private
  public
    procedure GibtNachricht_Aus(str:Pchar);
  end;


procedure TTest.GibtNachricht_Aus;
begin
  ShowMessage(Str);
end;



exports
  GibtNachricht_Aus;
begin
end.
ich habe mir verschiende tutorials angesehen und das grundgerüst von meiner DLL davon abzuleiten.
Das beispiel mit der Classe habe ich in einem DelphiForum gefunden(weiß aber nicht mehr ob hier oder im DF)
mein ziel ist es eine eigne TStringList mit erweiterten funktionen zu entwicklen alles auch kein problem

ich versuche jetzt diese funktion wie folgt einzubinden(beispiel aus einem DLL tutor)
Delphi-Quellcode:
unit udll;

interface

uses windows,dialogs,SysUtils;

type
  PDRGibtNachrichtaus = procedure(Str:Pchar);
  
procedure LoadDll;
procedure GibtnachrichtAus(Test:PChar);cdecl;

var
  Nachricht:PDRGibtNachrichtaus = nil;
  
implementation

Function WhatIfNoEntry: Integer;
begin
  ShowMessage('Fehler');
  Halt;
end;

procedure LoadDll;
var
  lib:THandle;
begin
  lib := LoadLibrary('D:\Daten\eigene\delphi\dlls\myStringList\dll\myStringListDll.dll');

  case lib = 0 of
    TRUE: begin
      @Nachricht := @whatifnoentry;
      messagebox(0, 'DLL kann nicht geladen werde', nil, 0);
    end;
  else begin
    @Nachricht := GetProcAddress(lib, 'GibtnachrichtAus');

    if not Assigned(Nachricht) then
      @Nachricht := @whatifnoentry;
  end;
  end;
end;

procedure GibtnachrichtAus(Test:PChar);
begin
  Nachricht(test);
end;

end.
Im Hauptform rufe ich dann nur noch Load auf ein gibtNachRichtAus doch leider wird nur die Function
whatifnoentry weil so vermute ich bei @Nachricht := GetProcAddress(lib, 'GibtnachrichtAus'); irgenwas schiefläuft.

Kann mir jemand sagen was ich falsch mache ?
mein ziel ist es eine eigne klasse in ein DLL zu packen - eigentlich nicht weiter schwirig trotzdem habe ich probleme damit - leider -

Vielen dank im voraus für eure Hilfe
Michael Springwald
MFG
Michael Springwald,
Bitte nur Deutsche Links angeben Danke (benutzte überwiegend Lazarus)
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.105 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: Dlls benutzen

  Alt 2. Apr 2006, 11:58
Moin Michael,

bei GetProcAddress musst Du die Funktion exakt so schreiben, wie Du sie aus der DLL exportierst, in Deinem Falle also

@Nachricht := GetProcAddress(lib, 'GibtNachricht_Aus');
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#3

Re: Dlls benutzen

  Alt 2. Apr 2006, 12:01
du musst noch eine Instanz der Klasse innerhalb der DLL erstellen und dann eine Funktion schreiben welche die Instanz aufruft. Derzeit importierst du in deiner DLL die gleiche Funktion aus eben der gleichen DLL
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
mimi

Registriert seit: 1. Dez 2002
Ort: Oldenburg(Oldenburg)
2.008 Beiträge
 
FreePascal / Lazarus
 
#4

Re: Dlls benutzen

  Alt 2. Apr 2006, 14:19
Könntes du mir ein kleines beispiel geben ?
ich habe das jetzt so:
Delphi-Quellcode:
procedure GibtNachricht_Aus1(Str:Pchar); external 'myStringListDll.dllindex 1;

type
  TTest = class
  private
  public
    procedure GibtNachricht_Aus(str:Pchar);
  end;


procedure TTest.GibtNachricht_Aus;
begin
  ShowMessage(Str);
end;

var
  t:TTest;
begin
  t:=TTest.create;
  t.GibtNachricht_Aus('test');

end.

exports
  GibtNachricht_Aus;
jetzt kommt Test gleich beim starten der anwendung ist ja auch klar warum. aber ich möchte gerine das gibtNachricht_Aus erst aufgerufen wird wenn ich den Button drücke die klasse soll schon vohrer installisiert werden. wenn .ich dann auf den button drücke kommt nur die meldung: Fehler.
Michael Springwald
MFG
Michael Springwald,
Bitte nur Deutsche Links angeben Danke (benutzte überwiegend Lazarus)
  Mit Zitat antworten Zitat
mimi

Registriert seit: 1. Dez 2002
Ort: Oldenburg(Oldenburg)
2.008 Beiträge
 
FreePascal / Lazarus
 
#5

Re: Dlls benutzen

  Alt 2. Apr 2006, 14:20
achja aufrufen tue ich sie von Form1 so :
Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Buttons,udll;

type
  TForm1 = class(TForm)
    BitBtn1: TBitBtn;
    Label1: TLabel;
    Edit1: TEdit;
    procedure FormCreate(Sender: TObject);
    procedure BitBtn1Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  LoadDll;
end;

procedure TForm1.BitBtn1Click(Sender: TObject);
begin
  GibtnachrichtAus('test');
end;

end.
Michael Springwald
MFG
Michael Springwald,
Bitte nur Deutsche Links angeben Danke (benutzte überwiegend Lazarus)
  Mit Zitat antworten Zitat
Antwort Antwort


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 20:05 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