| |
|
|
- Seite 1 - |
|
Christian Schneider | Hallo Leute,
ich frickle schon eine ganze Weile daran rum eine Dll ans laufen zu bekommen (siehe Anhang).
Ich poste mal einen der Codes (davon gibt es ne Menge, mit der Gemeinsamkeit sie funkionieren nicht )
Da die Datenbank erstellt wird (hat seine Richtigkeit, wenn noch nicht vorhanden) und anschließend der Interpreter abschmiert, gehe ich mal davon aus es liegt am Rückgabewert.
Die Doku zur Funktion findet sich hier: [...]
Gruß Christian
P.S. Hatte mit dll´s bisher nicht wirklich viel am Hut ;)
Nutze die 11Sub12 |
|
|
| |
|
|
|
| |
|
- Seite 1 - |
|
Jac de Lad | Erklärt mal bitte jemand den Vorteil von cdecl? Und die Unterschiede? Und überhaupt??? |
|
|
| Profan² 2.6 bis XProfan 11.1+XPSE+XPIA+XPRR (und irgendwann XIDE) Core2Duo E8500/T2250, 8192/1024 MB, Radeon HD4850/Radeon XPress 1250, Vista64/XP | 10.01.2008 ▲ |
|
|
|
|
Christian Schneider | Da fällt mir spontan nur eins ein:
@JAC: [...] |
|
|
| |
|
|
|
Jac de Lad | Aha, hat also für den Ottonormalprofaner keine Auswirkungen?! |
|
|
| Profan² 2.6 bis XProfan 11.1+XPSE+XPIA+XPRR (und irgendwann XIDE) Core2Duo E8500/T2250, 8192/1024 MB, Radeon HD4850/Radeon XPress 1250, Vista64/XP | 10.01.2008 ▲ |
|
|
|
|
Christian Schneider | Nein. Außer das jetzt mehr dll´s nativ funkionieren als bisher.
@Roland: Was wenn man mehrere dll´s in einem Programm verwendet und ein Teil davon per cdecl und andere per stdcall arbeiten? |
|
|
| |
|
|
|
Jac de Lad | Welche denn zum Beispiel? |
|
|
| Profan² 2.6 bis XProfan 11.1+XPSE+XPIA+XPRR (und irgendwann XIDE) Core2Duo E8500/T2250, 8192/1024 MB, Radeon HD4850/Radeon XPress 1250, Vista64/XP | 10.01.2008 ▲ |
|
|
|
|
| Jac
Erklärt mal bitte jemand den Vorteil von cdecl? Und die Unterschiede? Und überhaupt???
Laienhaft ausgedrückt könnte man sagen auf Asmebene gibt es keine Funktionen und keine Funktionsparameter - es gibt aber Sprungadressen und einen Stack. Wenn man jetzt behauptet der Code hinter den Sprungadressen entspricht einem Funktionscode dann wird der Stack als Parametermerker benutzt. Man legt (push) also Werte auf den Stack und springt (call) dann zu einer Sprungadresse. Der Code dahinter nimmt die Werte von Stack (pop) um diese zu verarbeiten. Der Vollständigkeithalber könnte man erwähnen das ein möglicher Rückgabewert einer solchen Funktion grundsätzlich im eax-Register hinterlegt wird bevor die Funktion per ret den Rücksprung veranlasst.
Ob stdcall oder cdecl legt hierbei z.B. die Reihenfolge fest mit der die Werte vom Stack genommen werden. Bei cdecl werden die Params halt in umgekehrter Reihenfolge zu stdcall auf den Stack gepackt.
Je nachdem mit welcher Compileroption z.B. eine DLL kompiliert wurde (oder wie der asm gestrickt ist) muss man demnach mit cdecl oder stdcall aufrufen. |
|
|
| |
|
|
| |
|
- Seite 2 - |
|
|
Jac de Lad | Und wozu wurede das eingeführt? Warum ist das nicht einheitlich?? |
|
|
| Profan² 2.6 bis XProfan 11.1+XPSE+XPIA+XPRR (und irgendwann XIDE) Core2Duo E8500/T2250, 8192/1024 MB, Radeon HD4850/Radeon XPress 1250, Vista64/XP | 10.01.2008 ▲ |
|
|
|
|
| Jac
Und wozu wurede das eingeführt? Warum ist das nicht einheitlich??
Ideologisch betrachtet oder technisch? |
|
|
| |
|
|
|
Jac de Lad | |
|
| Profan² 2.6 bis XProfan 11.1+XPSE+XPIA+XPRR (und irgendwann XIDE) Core2Duo E8500/T2250, 8192/1024 MB, Radeon HD4850/Radeon XPress 1250, Vista64/XP | 10.01.2008 ▲ |
|
|
|
|
RGH | Christian Schneider
Nein. Außer das jetzt mehr dll´s nativ funkionieren als bisher.
@Roland: Was wenn man mehrere dll´s in einem Programm verwendet und ein Teil davon per cdecl und andere per stdcall arbeiten?
Es muß nur vor dem Aufruf der jeweiligen Funktion (also nicht schon bei DEF, ImportFunc oder ImportDLL) der richtige Aufrufmodus eingestellt sein. Derzeit werden aber nur CDECL und STDCALL unterstützt.
Und die CallBack-Funktionen sind immer im Windows-Standard STDCALL.
Gruß Roland |
|
|
| Intel Duo E8400 3,0 GHz / 4 GB RAM / 1000 GB HDD - ATI Radeon HD 4770 512 MB - Windows 7 Home Premium 32Bit - XProfan X4 | 10.01.2008 ▲ |
|
|
|
|
Michael Wodrich | Und ... - C-Compiler benutzen CDECL - Windows benutzt STDCALL - Assembler kann beides.
Das ist nur ein Pi-mal-Daumen Überblick. Da viele Programmiersprachen das Aufrufmodell frei wählen können werden sehr viele DLLs halt Windows-konform angeboten - aber leider nicht alle (meist die Interessantesten nicht).
Ein Grund für das leider nicht: die aus C her bekannten Funktionen mit beliebigen Parametern (int Anzahl, ...) gibt es nur in der CDECL-Variante.
Schöne Grüße Michael Wodrich
Autsch, das gibts auch alles bei Wikipedia - man muß sich nur zum Lesen durchringen. |
|
|
| Programmieren, das spannendste Detektivspiel der Welt. | 12.01.2008 ▲ |
|
|
|
|
RGH | Michael Wodrich
Und ... - C-Compiler benutzen CDECL - Windows benutzt STDCALL - Assembler kann beides.
Ein Grund für die verschiedenen Modelle ist, dass sich die Compilerhersteller ein Aufrufmodell für ihre intenen Funktionen ausdachten, lange bevor es Windows und/oder gemeinsam genutzte DLLs gab. Die Aufgabe war immer gleich: Die Parameter mussten auf den Stack und anschließend musste derselbe wieder aufgeräumt werden. Nur in der Reihenfolge der Parameter und der Frage, wer denn nun fürs Aufräumen zuständig ist (Funktion oder Aufrufer), gab es unterschiedliche Lösungen. Und zur Beschleunigung übergab man auch einige Parameter per Register.
Moderne Compiler (auch alle C und C++ Compiler) können aber bei Erstellung von gemeinsam genutzen Bibliotheken angeben, welche der Aufrufkonventionen genutzt werden. DELPHI benutzt z.B. defaultmäßig REGISTER (d.h. die ersten Parameter werden per Prozessorregister-Register übergeben - das spart Zeit und Stackspeicher), aber für DLLs kann man angeben, ob man CDECL, STDCALL oder FARPASCAL nutzen will. 32-Bit-Windows benutzt STDCALL, also sollte man unter Windows nutzbare DLLs vorzugsweise mit STDCALL kompilieren. (16-Bit-Windows nutzte FARPASCAL als Aufrufkonvention. Diese Konvention kommt aber meines Wissens in DLLs nicht mehr vor.) CDECL findet man oft bei in C++ erstellten Bibliotheken, die es, wie eben SQLite, für Linux und Windows gibt.
Gruß Roland |
|
|
| Intel Duo E8400 3,0 GHz / 4 GB RAM / 1000 GB HDD - ATI Radeon HD 4770 512 MB - Windows 7 Home Premium 32Bit - XProfan X4 | 12.01.2008 ▲ |
|
|
|