Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   dll einbinden (https://www.delphipraxis.net/130274-dll-einbinden.html)

youuu 5. Mär 2009 20:42


dll einbinden
 
Hi,

Ich habe eine Funktion aus einer Dll in mein Programm eingebunden und zwar so:

Delphi-Quellcode:

function ProzentBerechnung(Hauptwert: string; Nebenwert: string): string; external DLLNAME; stdcall;
doch es kommt eine Fehlermeldung und zwar diese:

[DCC Fehler] test.pas(124): E2037 Deklaration von 'ProzentBerechnung' unterscheidet sich von vorheriger Deklaration


kann mir jemand weiter helfen?


Dazu muss ich sagen ich hatte vorher die Funktion komplett im Programm stehen hab sie nun in eine Dll hinzugefügt und rufe Sie nun so auf allerdings klappt dies nicht wie man an dem Fehler sieht :/

mkinzler 5. Mär 2009 20:43

Re: dll einbinden
 
Wie sieht die Funktionsdeklaration in der Dll bzw. der Export aus?

Die Muhkuh 5. Mär 2009 20:44

Re: dll einbinden
 
Und mit Strings würde ich das ganze nicht machen, da Du sonst die BorlandMM.dll (oder weiß Gott, wie die heißt) mitgeben musst. Mach es lieber mit PChars.

youuu 5. Mär 2009 20:48

Re: dll einbinden
 
Delphi-Quellcode:
function ProzentBerechnung(Hauptwert: string; Nebenwert: string): string; stdcall;

begin
  if Hauptwert = '0' then
    Result:= '0'
  Else
    Result:= FloatToStrF(StrToFloat(Nebenwert)/StrToFloat(Hauptwert)*100,ffFixed,10,2);
end;

exports
  ProzentBerechnung,
  NFak,
  TorProzent;
so siehts es in der dll aus hab die anderen beiden funktionen mal außen vor gelassen

Luckie 5. Mär 2009 20:50

Re: dll einbinden
 
Und wie rufst du sie im Programm auf?

mkinzler 5. Mär 2009 20:51

Re: dll einbinden
 
Sorgst du dafür, das die selbe VCL verwendet wird (ShareMem in Uses)?

sirius 5. Mär 2009 20:53

Re: dll einbinden
 
Zitat:

Deklaration von 'ProzentBerechnung' unterscheidet sich von vorheriger Deklaration
Kann es sein, dass du die Funktion mit selben Namen noch einmal im Hauptprogramm hast?

Und mach mal aus den Strings --> WideStrings

youuu 5. Mär 2009 20:56

Re: dll einbinden
 
Zitat:

Zitat von Luckie
Und wie rufst du sie im Programm auf?

Delphi-Quellcode:
function ProzentBerechnung(Hauptwert: string; Nebenwert: string): string; external DLLNAME; stdcall;
so wird sie im eigentlich Programm aufgerufen.
Im Hauptprogramm ist die Funktion nicht noch einmal deklariert.

mkinzler 5. Mär 2009 21:08

Re: dll einbinden
 
Zitat:

so wird sie im eigentlich Programm aufgerufen.
Nein das ist die Deklaration als Dll-Import, nicht der Aufruf der Funktion

youuu 5. Mär 2009 21:14

Re: dll einbinden
 
Zitat:

Zitat von mkinzler
Zitat:

so wird sie im eigentlich Programm aufgerufen.
Nein das ist die Deklaration als Dll-Import, nicht der Aufruf der Funktion

das meinte ich sorry der aufruf geht so:

Delphi-Quellcode:

ProzentBerechnung("wert1","wert2")

BAMatze 6. Mär 2009 09:40

Re: dll einbinden
 
Hast du denn jetzt schon eine Lösung?

Schreibe mal, wie ich das mache: Also ich habe mehrere DLL´s für Perepherie-Geräte. Da wird mir z.B. eine Funktion gegeben in der Dokumentation für das Perepherie-Gerät, die lautet:
Delphi-Quellcode:
function MMC_COM_open(portnumber,baudrate:integer):integer;
Um diese in meinem Programm einzubinden habe ich sie wie folgt deklariert:

Delphi-Quellcode:
const ExtLib = 'MMC.DLL'
..
function MMC_COM_open(portnumber,baudrate:integer):integer;
            stdcall external ExtLib;
In deiner Unit kannst du sie dann ganz normal verwenden:

Delphi-Quellcode:
...
procedure Beispiel;
var iWert: integer;
begin
  // tue etwas
  iWert := function MMC_COM_open(1,9600);
  // tue weiteres
end;
gleiche Vorgehensweise nimmst du, wenn es sich nicht um Übergabewerte handelt, die den Typ Integer haben. Wenn du strings übergeben musst, kann es sein, dass du diese in PAnsiChar umcasten musst. Hier noch ein Bsp., wie ich eine Function einer DLL benutze, bei der ich dieses Umcasten verwenden muss:

Delphi-Quellcode:
MMC_sendCommand(PAnsiChar('SV'+inttostr(iGeschwindigkeit)));

youuu 6. Mär 2009 21:00

Re: dll einbinden
 
Liste der Anhänge anzeigen (Anzahl: 2)
hab es nun hinbekommen. Allerdings wenn ich nun mein Programm beende bekomme ich komischerweise diesen Fehler:

Siehe Anhang :)

mkinzler 6. Mär 2009 21:09

Re: dll einbinden
 
Wie sieht dein Code nun aus?

youuu 6. Mär 2009 21:13

Re: dll einbinden
 
hmm Problem scheint behoben, ich habe aus der DLL in uses einfach ShareMem gelöscht und habe es somit nur noch im Hauptprogramm stehen, seit dem tritt der Fehler nicht mehr auf.


War es ein Fehler ShareMem in die DLL zuschreiben?

youuu 6. Mär 2009 21:16

Re: dll einbinden
 
Zitat:

Zitat von mkinzler
Wie sieht dein Code nun aus?

genauso wie davor ich habe nur eine kleineigkeit entdeckt die den Fehler auslöste und zwar:

DLL
Delphi-Quellcode:

function NFak(Val: Integer): INT64; stdcall;
begin
  if Val < 0 then
    raise Exception.Create('Val muss größer/gleich 0 sein.');
  if Val = 0 then
    Val := 1;
  Result := 1;
  repeat
      Begin
        Result := Result * Val;
        Dec(Val)
      End;
  until Val <= 1;
end;


Programm
Delphi-Quellcode:

function NFak(Val: Integer): INT64; external DLL; stdcall;
stdcall stand nicht an der gleichen Stelle wie in der DLL dies hat wohl den Fehler verursacht, als ich es geändert habe ging es.

jaenicke 6. Mär 2009 21:18

Re: dll einbinden
 
Die Dateianhänge als Bitmap zu speichern ist keine gute Idee, wie wäre es mit .png oder meinetwegen auch .jpg? So sind die fast 3 MiB groß...

Wenn du mit Strings als Parameter oder Rückgabewert arbeitest, dann musst du gezwungenermaßen in DLL und Projekt (nicht Unit!) an erster Stelle ShareMem stehen haben.

Luckie 6. Mär 2009 23:55

Re: dll einbinden
 
Zitat:

Zitat von youuu
Siehe Anhang :)

Ähm, du hast fast zwei drei MB große Dteien angehangen. Spätestens beim Upload hätte dir auffallen sollen, dass dies Bitmap nicht unbedingt das optimale Format ist. :roll:

youuu 7. Mär 2009 11:06

Re: dll einbinden
 
Zitat:

Zitat von Luckie
Zitat:

Zitat von youuu
Siehe Anhang :)

Ähm, du hast fast zwei drei MB große Dteien angehangen. Spätestens beim Upload hätte dir auffallen sollen, dass dies Bitmap nicht unbedingt das optimale Format ist. :roll:

hab es ausversehen vergessen in jpg zu konverten :/ aber upload ging in 10 sek hab 16k leitung da merkt man nicht viel ^^


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:59 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz