| |
|
|
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 |
|
|
| |
|
|
|
Andreas Miethe
| Das liegt nicht am Rückgabewert. Die Dll nutzt CDECL-Aufrufkonventionen statt StdCall.
Siehe hier : [...] |
|
|
| Gruss Andreas ________ ________ ________ ________ _ Profan 3.3 - XProfanX2 Win 95,98,ME,2000,XP,Vista - Win 7 32 / 64 Bit ASUS X93S - Intel Core I7-NVIDIA GForce 540M 8GB Arbeitsspeicher Homepage : [...] | 10.01.2008 ▲ |
|
|
|
|
Christian Schneider | Danke, da wäre ich im Leben nicht drauf gekommen
Der Code läuft bei mir leider nicht. |
|
|
| |
|
|
|
Andreas Miethe
| Hast Du Dir die Beispiele von Uwe Pascal Niemeier mal runtergeladen ?
Funktioniert bei mir wunderbar.
Beispiel : KompilierenMarkierenSeparieren $H Windows.ph
proc CallCdecl----------------------------------CallCdecl-------------------------------
****************** © by TCS (Uwe Pascal Niemeier) 042006
declare asm#,RetVal&
dim asm#,36
long asm#, 0=-1947432107,166399045,-855390069,-394055169
long asm#,16=217613060,1166799479,-1949237496,1019370981,0
RetVal& = call( asm#,&(1),%pcount*4+8,&(2),&(3),&(4),&(5),&(6),
&(7),&(8),&(9),&(10),&(11),&(12),&(13),&(14) )
Dispose asm#
Return retval&
endproc---------------------------------------------------------------------------------
declare DB&,File$
declare SqlLite&,open&,close&-----------Cdecl-Funktionen
SqlLite&=usedll(sqlite3.dll)
open& =~GetProcAddress(SqlLite&,sqlite3_open)
close& =~GetProcAddress(SqlLite&,sqlite3_close)
File$ =Test1.db
CallCdecl(open&,Addr(File$),Addr(DB&))
Print Datenbank - Handle : +str$(DB&)
Waitinput
CallCdecl(close&,DB&)
FreeDll SqlLite&
|
|
|
| Gruss Andreas ________ ________ ________ ________ _ Profan 3.3 - XProfanX2 Win 95,98,ME,2000,XP,Vista - Win 7 32 / 64 Bit ASUS X93S - Intel Core I7-NVIDIA GForce 540M 8GB Arbeitsspeicher Homepage : [...] | 10.01.2008 ▲ |
|
|
|
|
Christian Schneider | Den hab ich übersehen. Danke, funktioniert. |
|
|
| |
|
|
|
RGH | Die Geschichte hat mich daran erinnert, dass ich schon länger vorhatte, in XProfan auch CDECL zu unterstützen. Ab der nächsten Subscriptionsversion funktioniert folgender Code: KompilierenMarkierenSeparierenDeclare hDLL&, hDB&, Ergebnis&, Pointer&, err&, col&, row&
Set(CallConv, CDECL)
hDLL&=UseDll(sqlite3.dll)
importfunc(hDLL&,sqlite3_open,db_open)
importfunc(hDLL&,sqlite3_exec,db_exec)
importfunc(hDLL&,sqlite3_close,db_close)
importfunc(hDLL&,sqlite3_free,db_free)
importfunc(hDLL&,sqlite3_free_table,db_free_table)
importfunc(hDLL&,sqlite3_get_table,db_get_table)
PROC dbError
parameters e&
if e& <> 0
print string$(e&,0)
db_free(e&)
else
print OK
endif
ENDPROC
CLS
Datenbank öffnen
db_open(test.db,addr(hDB&))
dbError(err&)
Tabelle ggf. löschen
db_exec(hDB&,DROP TABLE buecher,0,0,addr(err&))
dbError(err&)
Tabelle erzeugen
db_exec(hDB&,CREATE TABLE buecher (titel CHAR(40), autor CHAR(40), preis NUMBER(5,2)),0,0,addr(err&))
dbError(err&)
Daten einfügen
db_exec(hDB&,INSERT INTO buecher VALUES (XProfan für Dummies,RGH-Soft,19.90),0,0,addr(err&))
dbError(err&)
db_exec(hDB&,INSERT INTO buecher (titel, autor) VALUES (Speed für Profaner,Frank Abbing),0,0,addr(err&))
dbError(err&)
Tabelle auslesen
db_get_table(hDB&,SELECT * FROM buecher,addr(Ergebnis&),addr(row&),addr(col&),addr(err&))
dbError(err&)
print col&; Spalten / ;row&; Zeilen
Pointer& = 0
whileloop 1, row& + 1
whileloop 1, col&
if long(Ergebnis&,Pointer&) > 0
print string$(long(Ergebnis&,Pointer&),0);
else
print get(SQLNULL);
endif
print get(SQLDEL);
Inc Pointer&, 4
endwhile
print
endwhile
db_free_table(hDB&, Ergebnis&)
waitinput
db_close(hDB&)
FreeDLL hdll&
end
Neu ist lediglich Set(CallConv, CDECL).
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 ▲ |
|
|
|
|
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. |
|
|
| |
|
|