Aufrufkonventionen und Dlls?
Wie rufe ich eine Methode in einer DLL, die in C oder C++ geschrieben?
Die Bedeutung von Aufrufkonventionen
In Delphi wenn wir eine Prozedur oder Funktion, erklären können wir spezifizieren ein Übereinkommen mit einem der Richtlinien zu registrieren, Pascal, Cdecl und Stdcall Safecall.
Diese Konventionen bestimmen die Reihenfolge, in der Parameter an die Funktion/Prozedur übergeben werden.
Lassen Sie mich kurz erläutern, was bedeuten diese Konventionen.
Alles, was die Aufrufkonventionen machen Verwenden des Stapels, Parameter hin und her mit Ausnahme des Übereinkommens Register übergeben.
Register/Pascal:
Diese Konventionen übergeben Parameter (Prozedur/Funktion) von links nach rechts. Der am weitesten links stehenden Parameter ausgewertet und zuerst übergeben wird und der am weitesten rechts stehenden Parameter ausgewertet und zuletzt übergeben wird.
Das 'Register'-Aufrufkonvention macht verwenden der CPU-Register und daher ist es schneller als andere Konventionen. Bei der Verwendung dieses Übereinkommens findet keiner Stapel-Erstellung zur Laufzeit Wenn die Parameter kleiner oder gleich auf drei sind. Wenn die Parameter mehr als drei sind, werden die übrigen Parameter Stack verwendet.
Dieses Übereinkommens 'Registrieren' ist die Standardeinstellung in Delphi und es ist die effizienteste, weil es nicht schaffen/Stack zur Laufzeit verwenden.
Die 'Pascal'-Konvention wird aus Kompatibilitätsgründen verwendet.
Der Stack-Cleanup-Prozess für alle Konventionen erfolgt automatisch wenn der Aufruf außer 'Cdecl' zurückgegeben.
Cdecl/Stdcall/Safecall:
Diese Konventionen werden Parameter übergeben, von rechts nach links. Der am weitesten rechts stehenden Parameter wird ausgewertet und zuerst übergeben
und der am weitesten links stehenden Parameter ausgewertet und zuletzt übergeben wird. Mit diesem Übereinkommen muss der Aufrufer die Parameter aus dem Stapel zu entfernen, wenn der Aufruf zurückgegeben. So ist es die Verantwortung des Aufrufers.
Warum schreibe ich diese einfachen Dinge im Detail?
Ja. Dies wird sehr hilfreich sein, wenn Sie entweder in Delphi DLL zu schreiben und es in Delphi oder den Zugriff auf eine in anderen Sprachen geschriebene DLL zugreifen.
Wenn Sie eine Function-Prozedur in einer DLL in Delphi schreiben, werden Sie die Aufrufkonvention für jedes fest. Wenn Sie diese Funktionen/Prozeduren aus einer Anwendung über die statischen oder dynamischen Laden aufrufen, müssen Sie auch Aufrufkonvention anzugeben.
Beim Aufrufen einer DLL, die in C oder C++ geschrieben, müssen Sie die Konvention 'Cdecl' verwenden. Andernfalls Sie
wird am Ende in 'Zugriffsverletzung' Probleme und manchmal kann die Anwendung abstürzen. Auch die DLL, die Sie fordern, sollte auf den Suchpfad.
Ich habe konfrontiert in meinem Projekt ein Problem, nur weil diese Aufrufkonvention. Ich muss in meiner Anwendung eine Methode in eine C-DLL aufrufen. Ich kopierte die DLL in meinem Rechner. Dann ich alle Methoden in der DLL in Delphi deklariert und versucht, einer von ihnen anrufen. Beim Versuch, eine Methode zuzugreifen, bekam ich 'Access Violation'; manchmal die Anwendung aufgehängt und die gesamte Anwendung abgestürzt. Endlich ich sah in der Delphi-Hilfe und bekam die Lösung mit der Aufrufkonvention. So erklärt ich jede Methode in der DLL in Delphi mit der Richtlinie 'Cdecl'. Es funktionierte gut. Vergessen Sie also nicht, diese Richtlinie in jedem Methodenaufruf aus einer in C/C++ geschriebenen DLL hinzufügen.
Ich habe manchmal wieder eine Person, die dieses Problem im Forum wie Gewusst wie: Aufrufen einer Methode in einer DLL in C/C++ geschrieben. Dies ist die Lösung.
Genießen!!!
Vielen Dank.
Magesh.
Aufrufkonventionen und Dlls?
Aufrufkonventionen und Dlls? : Mehreren tausend Tipps, um Ihr Leben einfacher machen.
Wie rufe ich eine Methode in einer DLL, die in C oder C++ geschrieben?
Die Bedeutung von Aufrufkonventionen
In Delphi wenn wir eine Prozedur oder Funktion, erklären können wir spezifizieren ein Übereinkommen mit einem der Richtlinien zu registrieren, Pascal, Cdecl und Stdcall Safecall.
Diese Konventionen bestimmen die Reihenfolge, in der Parameter an die Funktion/Prozedur übergeben werden.
Lassen Sie mich kurz erläutern, was bedeuten diese Konventionen.
Alles, was die Aufrufkonventionen machen Verwenden des Stapels, Parameter hin und her mit Ausnahme des Übereinkommens Register übergeben.
Register/Pascal:
Diese Konventionen übergeben Parameter (Prozedur/Funktion) von links nach rechts. Der am weitesten links stehenden Parameter ausgewertet und zuerst übergeben wird und der am weitesten rechts stehenden Parameter ausgewertet und zuletzt übergeben wird.
Das 'Register'-Aufrufkonvention macht verwenden der CPU-Register und daher ist es schneller als andere Konventionen. Bei der Verwendung dieses Übereinkommens findet keiner Stapel-Erstellung zur Laufzeit Wenn die Parameter kleiner oder gleich auf drei sind. Wenn die Parameter mehr als drei sind, werden die übrigen Parameter Stack verwendet.
Dieses Übereinkommens 'Registrieren' ist die Standardeinstellung in Delphi und es ist die effizienteste, weil es nicht schaffen/Stack zur Laufzeit verwenden.
Die 'Pascal'-Konvention wird aus Kompatibilitätsgründen verwendet.
Der Stack-Cleanup-Prozess für alle Konventionen erfolgt automatisch wenn der Aufruf außer 'Cdecl' zurückgegeben.
Cdecl/Stdcall/Safecall:
Diese Konventionen werden Parameter übergeben, von rechts nach links. Der am weitesten rechts stehenden Parameter wird ausgewertet und zuerst übergeben
und der am weitesten links stehenden Parameter ausgewertet und zuletzt übergeben wird. Mit diesem Übereinkommen muss der Aufrufer die Parameter aus dem Stapel zu entfernen, wenn der Aufruf zurückgegeben. So ist es die Verantwortung des Aufrufers.
Warum schreibe ich diese einfachen Dinge im Detail?
Ja. Dies wird sehr hilfreich sein, wenn Sie entweder in Delphi DLL zu schreiben und es in Delphi oder den Zugriff auf eine in anderen Sprachen geschriebene DLL zugreifen.
Wenn Sie eine Function-Prozedur in einer DLL in Delphi schreiben, werden Sie die Aufrufkonvention für jedes fest. Wenn Sie diese Funktionen/Prozeduren aus einer Anwendung über die statischen oder dynamischen Laden aufrufen, müssen Sie auch Aufrufkonvention anzugeben.
Beim Aufrufen einer DLL, die in C oder C++ geschrieben, müssen Sie die Konvention 'Cdecl' verwenden. Andernfalls Sie
wird am Ende in 'Zugriffsverletzung' Probleme und manchmal kann die Anwendung abstürzen. Auch die DLL, die Sie fordern, sollte auf den Suchpfad.
Ich habe konfrontiert in meinem Projekt ein Problem, nur weil diese Aufrufkonvention. Ich muss in meiner Anwendung eine Methode in eine C-DLL aufrufen. Ich kopierte die DLL in meinem Rechner. Dann ich alle Methoden in der DLL in Delphi deklariert und versucht, einer von ihnen anrufen. Beim Versuch, eine Methode zuzugreifen, bekam ich 'Access Violation'; manchmal die Anwendung aufgehängt und die gesamte Anwendung abgestürzt. Endlich ich sah in der Delphi-Hilfe und bekam die Lösung mit der Aufrufkonvention. So erklärt ich jede Methode in der DLL in Delphi mit der Richtlinie 'Cdecl'. Es funktionierte gut. Vergessen Sie also nicht, diese Richtlinie in jedem Methodenaufruf aus einer in C/C++ geschriebenen DLL hinzufügen.
Ich habe manchmal wieder eine Person, die dieses Problem im Forum wie Gewusst wie: Aufrufen einer Methode in einer DLL in C/C++ geschrieben. Dies ist die Lösung.
Genießen!!!
Vielen Dank.
Magesh.
Aufrufkonventionen und Dlls?
By Wiezutun
Aufrufkonventionen und Dlls? : Mehreren tausend Tipps, um Ihr Leben einfacher machen.