Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi dll Kompatibilität (https://www.delphipraxis.net/150238-dll-kompatibilitaet.html)

Berni68 11. Apr 2010 08:04


dll Kompatibilität
 
Hallo zusammen,

mit Delphi5 kompiliert kann ich die dll:
Delphi-Quellcode:
library FirebirdUdf;
uses
  SysUtils, Classes, Windows, FileCtrl;
function DateiLoeschen(Datei:PChar):Shortint; stdcall;
begin
  if DeleteFile(Datei) then Result:= 0
                       else Result:= 1;
end;
{$R *.RES}
exports
  DateiLoeschen,
begin
end.
problemlos in Firebird als UDF verwenden.

Kompiliere ich den Quelltext mit Delphi2010 versteht Firebird die dll nicht.
Weder Strings(Unicode?) noch integer (in andere Funktionen verwendet) kommen an, werden ausgegeben.

Fragen:
1. Warum ist das so
2. Wie kann ich den Quelltext mit Delphi2010 kompilieren dass es wieder geht (Compiler Direktiven?)
3. Wie 'sieht' man dem Programm an (in diesem Fall Firebird) welche 'Version' benötigt wird.
Nach was muss man diesbezüglich in der Doku suchen?

Bin für jeden Hinweis dankbar.

turboPASCAL 11. Apr 2010 08:29

Re: dll Kompatibilität
 
Delphi-Quellcode:
library FirebirdUdfDelFile;

uses
  Windows;

function DateiLoeschen(Dateiname: PAnsiChar): LongBool; stdcall;
begin
  Result := Windows.DeleteFile(Dateiname);
end;

exports
  DateiLoeschen;

end.
und das wäre meine Variante dazu. (zudem ist danach die DLL nur noch 'n paar KB gross)

Berni68 11. Apr 2010 09:04

Re: dll Kompatibilität
 
ab ich mal ausprobiert:

PAnsiChar musste ich zu PWideChar ändern, sonst lässt's sich nicht kompilieren.
die dll wird in Firebird erkannt, tut aber nicht was sie soll!
(Eingabeparameter als varchar Rückgabewert als integer)
Ein löschen der Datei ist nicht möglich.

das nächste Problem ist, dass ich in anderen Funktionen noch:
ExtractFileDir
DirectoryExists
ForceDirectories
CopyFile
RenameFile
benötige. Die Unit windows deckt das glaub ich nicht alles ab (muss aber noch genauer schauen)

himitsu 11. Apr 2010 09:13

Re: dll Kompatibilität
 
Zitat:

Zitat von Berni68
PAnsiChar musste ich zu PWideChar ändern, sonst lässt's sich nicht kompilieren.

Da PChar unter D5 PAnsiChar entsprach und somit die DLL ANSI als Schnittstelle bereitstellte,

mußt du die Schnittstelle auch weiterhin als ANSI zur Verfügung stellen und demnach mit PAnsiChar arbeiten.
Wenn es sich so aber nicht kompilieren läßt, dann mußt du es Intern so ändern, daß es geht.
Die Schnittstelle darf nicht verändert werden.

Delphi-Quellcode:
function DateiLoeschen(Dateiname: PAnsiChar): LongBool; stdcall;
begin
  Result := Windows.DeleteFileA(Dateiname);
                           // ^ ANSI-Version
end;
egal welche Delphi-Version, es ist bei der WinAPI immer so geregelt:

die beiden Funktionen, welche die WinAPI bereitstellt
DeleteFileA = Ansi
DeleteFileW = Unicode



DeleteFile = eine Umleitung zu einer der beiden anderen Funktionen,
jenachdem welcher Compiler und Optionen verwendet werden.

D5 ist "nativ" ein Ansi-Compiler und leitet demnach DeleteFile nach DeleteFileA um
und D2009 ist "nativ" ein Unicode-Compiler und leitet somit DeleteFile nach DeleteFileW um.

Zitat:

die dll wird in Firebird erkannt, tut aber nicht was sie soll!
Ist auch klar, da die Schnittstelle jetzt anders ist.
Firebird schickt dir einen AnsiString aka PAnsiChar
und du wertest dieses aber wie einen PWideChar aus.

Eine DLL gibt nach außen nur den Funktionsnamen, eventuell eine ID/Index und den nötigen Eintritspunkt bekannt, aber über den Aufbau der Schnittstelle kann man nicht erfahren, darum dürfen Schnittstellen "nie" verändert werden (solange man nicht beide Seiten gleichzeitig umbaut und eine Vermischen, der alten und neuen Version, nich 100%ig ausschließen kann).

Berni68 11. Apr 2010 09:32

Re: dll Kompatibilität
 
Super, danke
jetzt klappt die dll.
Aber woher weiß ich/woran sehe ich was benötigt wird?
Wo steht was in der (Firebird) Doku dass ich weiss hier muss man 'Ansi-Compilierte' dll erstellen.
Nach was muss man hier suchen?

(Das mit dem Unicode macht mich echt fertig. An allen Ecken und Enden gibt's damit Probleme :wall: )

turboPASCAL 11. Apr 2010 09:44

Re: dll Kompatibilität
 
Zitat:

DeleteFile nach DeleteFileA um
Autsch, ja das A hatte ich vergessen. :snowball:


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:18 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