Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu

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

AW: Call einer DLL von einem Delphi Prg

  Alt 11. Apr 2017, 22:21
Der Hauptgrund "string" wurde ja bereits genannt.

"String" ist ein Delphi-Typ
und hat nichts mit den C-Strings zu tun.

Außerdem hat "String" oder "PChar" niemals etwas in APIs zu suchen.
Denn das sind dynamische Typen und Schnittstellen sind immer statisch/unveränderlich. (sollten es sein, oder jemand hat geschlafen)
Denn z.B. seit Delphi 2009 sind String/PChar Unicode/Wide und davor waren sie ANSI.
Also in deinem Fall ist es PAnsiChar.



Und wenn du schon dabei bist dir die Grundlagen anzueignen, dann bitte auch das Thema Fehlerbehandlung nicht vernachlässigen.

Delphi-Quellcode:
hmod := LoadLibrary('QMC_DLL.dll');
if (hmod <> 0) then begin

end
else
  ShowMessage('LoadLibrary Failed!');
Es ist schonmal nicht schlecht überhaupt erstmal Fehler zu behandeln,
aber es ist nicht "klug", wenn man den eigentlichen Fehler fahrlässig vernichtet.

Denn warum ist das nun fehlgeschlagen?
Diese APIs geben auch den Grund des Fehlers an. (natürlich nur, wenn es einen Fehler gab)
MSDN-Library durchsuchenLoadLibrary siehe "Return Value"
MSDN-Library durchsuchenGetLastError
Delphi-Quellcode:
else
  RaiseLastOSError;
Delphi-Referenz durchsuchenRaiseLastOSError
Delphi-Quellcode:
else
  ShowMessage('LoadLibrary Failed!' + sLineBreak + ' FehlerCode: ' + IntToStr(GetLastError);
Delphi-Quellcode:
else
  ShowMessage('LoadLibrary Failed!' + sLineBreak + SysErrorMessage(GetLastError));
Falls zwischen der API (z.B. LoadLibrary) und dem GetLastError eine WinAPI aufgerufen werden könnte, dann GetLastError so schnell wie möglich auslesen und zwischenspeichern.
z.B. könnte beim Zusammenbau der davorliegenden Strings Speicher resserviert werden, was ein paar WinAPI-Aufrufe zur Folge hätte.
Delphi-Quellcode:
else
begin
  ErrorCode := GetLastError;
  ShowMessage('LoadLibrary Failed!' + sLineBreak + SysErrorMessage(ErrorCode));
end;
Hier geht es aber zufällig, da vorher nur String-Konstanten liegen und somit IntToStr/SysErrorMessage und GetLastError die ersten Funktionsaufrufe sind.

Für den Entwickler ist es eventuell gibt auch die Fehlerstelle oder den Dateinamen mit auszugeben.
Wenn mal jemand diese Fehlermeldung sieht, dann weißt du gleich wo der Fehler zu suchen ist.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (11. Apr 2017 um 22:32 Uhr)
  Mit Zitat antworten Zitat