AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

dll Kompatibilität

Ein Thema von Berni68 · begonnen am 11. Apr 2010 · letzter Beitrag vom 11. Apr 2010
Antwort Antwort
Berni68

Registriert seit: 9. Jan 2006
Ort: Villingen
162 Beiträge
 
Delphi XE5 Professional
 
#1

dll Kompatibilität

  Alt 11. Apr 2010, 09:04
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.
Bernhard
  Mit Zitat antworten Zitat
Benutzerbild von turboPASCAL
turboPASCAL

Registriert seit: 8. Mai 2005
Ort: Sondershausen
4.274 Beiträge
 
Delphi 6 Personal
 
#2

Re: dll Kompatibilität

  Alt 11. Apr 2010, 09:29
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)
Matti
Meine Software-Projekte - Homepage - Grüße vom Rüsselmops -Mops Mopser
  Mit Zitat antworten Zitat
Berni68

Registriert seit: 9. Jan 2006
Ort: Villingen
162 Beiträge
 
Delphi XE5 Professional
 
#3

Re: dll Kompatibilität

  Alt 11. Apr 2010, 10:04
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)
Bernhard
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#4

Re: dll Kompatibilität

  Alt 11. Apr 2010, 10:13
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).
$2B or not $2B
  Mit Zitat antworten Zitat
Berni68

Registriert seit: 9. Jan 2006
Ort: Villingen
162 Beiträge
 
Delphi XE5 Professional
 
#5

Re: dll Kompatibilität

  Alt 11. Apr 2010, 10:32
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 )
Bernhard
  Mit Zitat antworten Zitat
Benutzerbild von turboPASCAL
turboPASCAL

Registriert seit: 8. Mai 2005
Ort: Sondershausen
4.274 Beiträge
 
Delphi 6 Personal
 
#6

Re: dll Kompatibilität

  Alt 11. Apr 2010, 10:44
Zitat:
DeleteFile nach DeleteFileA um
Autsch, ja das A hatte ich vergessen.
Matti
Meine Software-Projekte - Homepage - Grüße vom Rüsselmops -Mops Mopser
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:54 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