Fehler im header für eine DLL

Antworten
StepLaz
Beiträge: 5
Registriert: Mi 30. Sep 2009, 15:44

Fehler im header für eine DLL

Beitrag von StepLaz »

Hallo zusammen ...

da ich jetzt das erste Mal eine fremde DLL in einem Programm benutzen will, stehe ich etwas auf der Leitung.

Ich will folgende (Delphi)Unit unter Windows benutzen:

Code: Alles auswählen

unit LJUDDelphi;
 
{$MODE Delphi}
 
interface
 
type
  LJ_HANDLE = Integer;
  LJ_ERROR = LongInt;
  TPLongInt = ^LongInt;      //LongInt pointer
  TPDouble = ^Double;        //Double pointer
 
  function ListAll(DeviceType: LongInt; ConnectionType: LongInt; var pNumFound: LongInt; pSerialNumbers: TPLONGINT; pIDs: TPLONGINT; pAddresses: TPDOUBLE): LJ_ERROR stdcall;
  function ListAllS(pDeviceType: PChar; pConnectionType: PChar; var pNumFound: LongInt; pSerialNumbers: TPLongInt; pIDs: TPLongInt; pAddresses: TPDouble): LJ_ERROR stdcall;


und bekomme dabei immer diese Fehlermeldung:
LJUDDelphi.pas(543,12) Error: function header doesn't match the previous declaration "ListAll:LongInt; StdCall;"


Wo liegt denn hier der Fehler? Ich habe vorher die Unit in eine Lazarus-Unit gewandelt ... worauf muss ich hier noch achten? Bin leider über die Suchfunktion hier im Forum auf keine Antwort gekommen ...

Gruß Step

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6209
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:

Re: Fehler im header für eine DLL

Beitrag von af0815 »

Im interface UND implemention Teil ist die Definition gleich ?
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

StepLaz
Beiträge: 5
Registriert: Mi 30. Sep 2009, 15:44

Re: Fehler im header für eine DLL

Beitrag von StepLaz »

Ich denke schon ... hier der Implementation-Teil:

Code: Alles auswählen

implementation
  function ListAll: LJ_ERROR stdcall; external 'labjackud.dll';


Gibt es hier evtl. etwas, was fehlt :

Code: Alles auswählen

uses
  Classes, SysUtils, FileUtil, LResources, Forms, Controls, Graphics, Dialogs,
  Menus, Windows, LJUDDelphi;


?

Benutzeravatar
theo
Beiträge: 10497
Registriert: Mo 11. Sep 2006, 19:01

Re: Fehler im header für eine DLL

Beitrag von theo »

Wie soll das gehen? Im Interface hast du zwei überladene Funktionen, mal mit PChar, mal mit Longint und in der implementierung nur eine?

StepLaz
Beiträge: 5
Registriert: Mi 30. Sep 2009, 15:44

Re: Fehler im header für eine DLL

Beitrag von StepLaz »

Es geht (erstmal) nur um die function ListAll (NICHT ListAllS) und dort ist kein PChar ...

Die Fehlermeldung kommt schon bei der ersten function ListAll.

Hier noch mal der Vollständigkeit halber:

Code: Alles auswählen

interface
 
type
  LJ_HANDLE = Integer;
  LJ_ERROR = LongInt;
  TPLongInt = ^LongInt;      //LongInt pointer
  TPDouble = ^Double;        //Double pointer
 
  function ListAll(DeviceType: LongInt; ConnectionType: LongInt; var pNumFound: LongInt; pSerialNumbers: TPLONGINT; pIDs: TPLONGINT; pAddresses: TPDOUBLE): LJ_ERROR stdcall;
  function ListAllS(pDeviceType: PChar; pConnectionType: PChar; var pNumFound: LongInt; pSerialNumbers: TPLongInt; pIDs: TPLongInt; pAddresses: TPDouble): LJ_ERROR stdcall;
 
 
implementation
  function ListAll: LJ_ERROR stdcall; external 'labjackud.dll';
  function ListAllS: LJ_ERROR stdcall; external 'labjackud.dll';


Es gibt hier noch wesentlich mehr Funktionen, die ich aber erstmal ausgeblendet habe ...

Benutzeravatar
theo
Beiträge: 10497
Registriert: Mo 11. Sep 2006, 19:01

Re: Fehler im header für eine DLL

Beitrag von theo »

Soweit ich weiss, reicht es, das Ganze im interface zu deklarieren:

Code: Alles auswählen

interface
 
type
LJ_HANDLE = Integer;
LJ_ERROR = LongInt;
TPLongInt = ^LongInt; //LongInt pointer
TPDouble = ^Double; //Double pointer
 
function ListAll(DeviceType: LongInt; ConnectionType: LongInt; var pNumFound: LongInt; pSerialNumbers: TPLONGINT; pIDs: TPLONGINT; pAddresses: TPDOUBLE): LJ_ERROR stdcall; external 'labjackud.dll';
function ListAllS(pDeviceType: PChar; pConnectionType: PChar; var pNumFound: LongInt; pSerialNumbers: TPLongInt; pIDs: TPLongInt; pAddresses: TPDouble): LJ_ERROR stdcall; external 'labjackud.dll';
 
implementation     
..



Ansonsten Parameterliste in implementation wiederholen

carli
Beiträge: 657
Registriert: Sa 9. Jan 2010, 17:32
OS, Lazarus, FPC: Linux 2.6.x, SVN-Lazarus, FPC 2.4.0-2
CPU-Target: 64Bit

Re: Fehler im header für eine DLL

Beitrag von carli »

StepLaz hat geschrieben:LJUDDelphi.pas(543,12) Error: function header doesn't match the previous declaration "ListAll:LongInt; StdCall;"

Ich denke schon ... hier der Implementation-Teil:

implementation
function ListAll: LJ_ERROR stdcall; external 'labjackud.dll';



NICHTS ist gleich.
Du hast ne andere Signatur (=Parameterliste) in der implementation als im Interface stehen.

Dreister gehts doch nicht: Du schreibst nicht matchende Deklaration/Implementation, bekommst den Fehler, dass es nicht matcht, wirst gefragt, ob es wirklich nicht matcht und postest uns als Beweis den Code, der wirklich nicht matcht.

Benutzeravatar
theo
Beiträge: 10497
Registriert: Mo 11. Sep 2006, 19:01

Re: Fehler im header für eine DLL

Beitrag von theo »

@Carli: Mal nicht so forsch. So ähnlich geht das schon auch, allerdings in {$mode delphi} und ohne dekl. des Rückgabewerts.

Code: Alles auswählen

{$mode delphi}{$H+}
 
type
LJ_HANDLE = Integer;
LJ_ERROR = LongInt;
TPLongInt = ^LongInt; //LongInt pointer
TPDouble = ^Double; //Double pointer
 
function ListAll(DeviceType: LongInt; ConnectionType: LongInt; var pNumFound: LongInt; pSerialNumbers: TPLONGINT; pIDs: TPLONGINT; pAddresses: TPDOUBLE): LJ_ERROR stdcall;
function ListAllS(pDeviceType: PChar; pConnectionType: PChar; var pNumFound: LongInt; pSerialNumbers: TPLongInt; pIDs: TPLongInt; pAddresses: TPDouble): LJ_ERROR stdcall;
 
implementation
function ListAll; stdcall; external 'labjackud.dll';
function ListAllS; stdcall; external 'labjackud.dll';

carli
Beiträge: 657
Registriert: Sa 9. Jan 2010, 17:32
OS, Lazarus, FPC: Linux 2.6.x, SVN-Lazarus, FPC 2.4.0-2
CPU-Target: 64Bit

Re: Fehler im header für eine DLL

Beitrag von carli »

theo hat geschrieben:@Carli: Mal nicht so forsch. So ähnlich geht das schon auch, allerdings in {$mode delphi} und ohne dekl. des Rückgabewerts.


Dass das in Delphi so geht, wusste ich nicht.
Man sollte trotzdem den Abwärtskompatibilitätsmodus nicht zum Einführen neuer Features benutzen.

StepLaz
Beiträge: 5
Registriert: Mi 30. Sep 2009, 15:44

Re: Fehler im header für eine DLL

Beitrag von StepLaz »

@carli
Wenn du dir mein Listing durchliest, hättest du diese Passage eigentlich sehen sollen ... {$mode delphi} ... aber immerhin - sehr "selbstbewußt" ... ;)


@theo
Danke ... endlich mal eine konstruktive Antwort!

Scheint ja ein etwas rüder Umgangston hier zu herrschen ... bin ich eigentlich aus anderen Foren nicht so gewohnt ... und das "vergrault" alten Delphi-Usern auch den Umstieg - aber vielleicht ist das ja gewollt ...

Benutzeravatar
theo
Beiträge: 10497
Registriert: Mo 11. Sep 2006, 19:01

Re: Fehler im header für eine DLL

Beitrag von theo »

StepLaz hat geschrieben:... aber immerhin - sehr "selbstbewußt" ... ;)


Dieses Kompliment kann ich nur zurückgeben.
Im vierten Beitrag schon mal über die Forumsmitglieder ablästern ist auch nicht schlecht... ;-)

Hitman
Beiträge: 512
Registriert: Mo 25. Aug 2008, 18:17
OS, Lazarus, FPC: ArchLinux x86, WinVista x86-64, Lazarus 0.9.29, FPC 2.4.1
CPU-Target: x86
Wohnort: Chemnitz

Re: Fehler im header für eine DLL

Beitrag von Hitman »

theo hat geschrieben:Dieses Kompliment kann ich nur zurückgeben.

Kannst du nicht - weils nicht an dich gerichtet war :D

Aber mal im ernst: nicht alles so finster sehen. Ein paar sarkastische Kommentare muss man schon abkönnen im Internet :D

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6209
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:

Re: Fehler im header für eine DLL

Beitrag von af0815 »

StepLaz hat geschrieben:Scheint ja ein etwas rüder Umgangston hier zu herrschen ... bin ich eigentlich aus anderen Foren nicht so gewohnt ... und das "vergrault" alten Delphi-Usern auch den Umstieg - aber vielleicht ist das ja gewollt ...


Nein, der Umgangston ist nicht rüde, das war eher nett gemeint :-)

Vielleicht als Umsteiger von Delphi - Man sollte sich alsbaldig mit den Feinheiten des Lazarus aber ganz besonders des darunter wrkenden FPC vertraut machen. Delphi hat bei etliche Sachen probiert das zu machen was der Programmierer vielleicht gemeint hat. Da ist der FPC wesentlich pingeliger, siehe oben. Gerade bei den Deklarationen sollte man im zweifelsfall es mit der vollen Ausschreibung tun, das minimiert Fehler.

Gute Quellen sind die Dokus zu FPC und Lazarus, neben der Wiki. Es ist immer wieder Wert bei Fragen dort einen Blick hinein zu machen.

Beispiele: (leider viel zu wenig beachtet)
Sprachreferenz
Programmers Guide
FCL-Refernenz
RTL_Referenz
User Guide
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

carli
Beiträge: 657
Registriert: Sa 9. Jan 2010, 17:32
OS, Lazarus, FPC: Linux 2.6.x, SVN-Lazarus, FPC 2.4.0-2
CPU-Target: 64Bit

Re: Fehler im header für eine DLL

Beitrag von carli »

StepLaz hat geschrieben:Scheint ja ein etwas rüder Umgangston hier zu herrschen ... bin ich eigentlich aus anderen Foren nicht so gewohnt ... und das "vergrault" alten Delphi-Usern auch den Umstieg - aber vielleicht ist das ja gewollt ...


Tut mir leid, wenn ich dir zu nahe getreten bin, ich würde es ja eher als "direkt und ehrlich" statt "rüde" bezeichnen.
Ansonsten kenne ich auch Foren, in denen es _wirklich_ schlimmer abläuft, da ist das Lazarusforum der reine Himmel auf Erden.

StepLaz
Beiträge: 5
Registriert: Mi 30. Sep 2009, 15:44

Re: Fehler im header für eine DLL

Beitrag von StepLaz »

Tja ... man lernt immer was dazu ;) ... für mich ist das Thema nun erledigt. Danke ... und Tschüss ...

Antworten