Frage zur DLL einbindung

Für alles, was in den übrigen Lazarusthemen keinen Platz, aber mit Lazarus zutun hat.
Antworten
khh
Beiträge: 489
Registriert: Sa 5. Apr 2008, 09:37
OS, Lazarus, FPC: Win Vista,Win 7 (L 0.9.29 FPC 2.4.1)
CPU-Target: 32Bit /64 Bit
Wohnort: Nähe Freiburg i.Br.

Frage zur DLL einbindung

Beitrag von khh »

hallo zusammen,
ichhab eine funktion
ExtractDateinameOhneExt('Hallowelt.dat');
Wenn ich diese Funktion direkt ins Programm schreibe funktioniert alles wie es soll.
Ich habe die Funktion jetzt in eine dll ausgelagert und egal was ich der Funktion übergebe
steht im Rückgabewert immer der Programmname des aufrufenden Programms.


ich gehe mal davon aus, dass ich das mit der DLL richtig gemacht habe ;-)


hier die DLL:

Code: Alles auswählen

library tools;
 
{$mode objfpc}{$H+}
 
 
  { you can add units after this }
 uses
  Classes, SysUtils, windows;
  // extraiert den reinen Dateinamen ohne Pfad oder Erweiterung
function ExtractDateinameOhneExt(FileName: String) : String; stdcall;
 
var Ext : String;
x : Integer;
begin
Result := ExtractFileName(FileName);
Ext := ExtractFileExt(Result);
if Ext = '' then exit;
repeat
x := Pos('.', Result)
until x <> 0;
Delete(Result, x, Length(Result));
end;
 
 
exports ExtractDateinameOhneExt index 1 ;
begin
end.
was passiert da ?
der Aufruf im Prog ist folgender:

dateinameohne2:= ExtractDateinameOhneExt('Hallowelt.dat');

danke für eure Hilfe

Gruss KH

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

Beitrag von theo »

Dass der Programmname zurückkommt, kann ich mir mit dem vorliegenden Code nicht vorstellen.
Generell würde ich immer PChar statt String empfehlen um mit der DLL zu kommunizieren.

Aber da ist noch anderes käsig.
Dein repeat loop repetiert ewig, wenn kein '.' vorkommt - sehr schlecht (OK, macht ein exit wenn kein . da ist. Aber trotzdem schlecht.)
Kommt noch dazu das der Loop immer das gleiche machen würde, also auch deshalb komplett überflüssig ist.

Ausserdem brauchst du das Pos() gar nicht. Du hast die Länge der Filenamens und der Ext. Damit hast du alle Infos um das Delete zu speisen.

Die Fkt macht auch was du willst:

Code: Alles auswählen

function ExtractFileNameID(inp:PChar):PChar;
var TempS:String;
begin
  TempS:=ExtractFileName(inp); 
  Result:=PChar(Copy(TempS,1,Length(TempS)-Length(ExtractFileExt(Temps))));
end;

khh
Beiträge: 489
Registriert: Sa 5. Apr 2008, 09:37
OS, Lazarus, FPC: Win Vista,Win 7 (L 0.9.29 FPC 2.4.1)
CPU-Target: 32Bit /64 Bit
Wohnort: Nähe Freiburg i.Br.

Beitrag von khh »

@theo
ich danke dir,werd ich mal deine fkt ausprobieren.

Gruss KH

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 »

ich weiß natürlich nicht ob deine Funktion nur als Übung für DLLS gedacht ist, aber so eine Funktion gibt es schon:
ExtractFileNameOnly in der FileUtil
oder
ExtractFileNameWithoutExt
je nach dem was du brauchst.
(Ich hoffe ich habe deine Funktion nicht falsch verstanden)
MFG
Michael Springwald

khh
Beiträge: 489
Registriert: Sa 5. Apr 2008, 09:37
OS, Lazarus, FPC: Win Vista,Win 7 (L 0.9.29 FPC 2.4.1)
CPU-Target: 32Bit /64 Bit
Wohnort: Nähe Freiburg i.Br.

Beitrag von khh »

@michael,
ja es war zum test für die dll einbindung gedacht.
Dass es die ensprechenden Funktionen schon gibt, hab ich allerdings auch nicht gewusst.
Danke dir
Gruss KH

Antworten