![]() |
dll Kompatibilität
Hallo zusammen,
mit Delphi5 kompiliert kann ich die dll:
Delphi-Quellcode:
problemlos in Firebird als UDF verwenden.
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. 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. |
Re: dll Kompatibilität
Delphi-Quellcode:
und das wäre meine Variante dazu. (zudem ist danach die DLL nur noch 'n paar KB gross)
library FirebirdUdfDelFile;
uses Windows; function DateiLoeschen(Dateiname: PAnsiChar): LongBool; stdcall; begin Result := Windows.DeleteFile(Dateiname); end; exports DateiLoeschen; end. |
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) |
Re: dll Kompatibilität
Zitat:
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:
egal welche Delphi-Version, es ist bei der WinAPI immer so geregelt:
function DateiLoeschen(Dateiname: PAnsiChar): LongBool; stdcall;
begin Result := Windows.DeleteFileA(Dateiname); // ^ ANSI-Version end; 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:
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). |
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: ) |
Re: dll Kompatibilität
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:49 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 by Thomas Breitkreuz