dll Funktion soll float an pb übergeben

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
MVXA
Beiträge: 3823
Registriert: 11.09.2004 00:45
Wohnort: Bremen, Deutschland
Kontaktdaten:

Beitrag von MVXA »

Ergnisse werden nach dem StdCall im Register EAX gespeicchert. Warum
aber das Ergebniss so auch zurückgegeben wird von der Funktion ist mir
ein Rätzel :?. Vielleicht irgend ein Fehler vom Programmierer der Sprache?
Bild
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

Habs erlebt bei einer DLL, die mit PowerBasic erstellt wurde, zur Nutzung mit VB. Hab mich immer gewundert warum CallFunctionFast 0 zurückgegeben hat, bis Danilo mir den Tip gab.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
hardfalcon
Beiträge: 3447
Registriert: 29.08.2004 20:46

Beitrag von hardfalcon »

ts-soft hat geschrieben:
hardfalcon hat geschrieben:Sooo weit kann ich ja gar nicht mehr logisch nachdenken... Noch dazu mit meinem praktisch nicht vorhandenen ASM-Skill... :(
Mit ProcedureReturn packste das Ergebnis auf dem Stack, manche DLLs legen es aber bereits dahin, so das Du den Stack nicht mehr verändern darfst um an das Ergebnis zu gelanden. Naja, so ungefähr
Das erklärt so einiges... Das heisst also, es hängt davon ab, mit/für welche Sprach die DLL erstellt wurde?
Benutzeravatar
AndyX
Beiträge: 1272
Registriert: 17.12.2004 20:10
Wohnort: Niederösterreich
Kontaktdaten:

Beitrag von AndyX »

Wenn man nur ProcedureReturn schreibt, wird automatisch der Wert in eax genommen :allright:
Benutzeravatar
Deeem2031
Beiträge: 1232
Registriert: 29.08.2004 00:16
Wohnort: Vorm Computer
Kontaktdaten:

Beitrag von Deeem2031 »

Genau, ich versteh nicht ganz was der Code bezwecken soll:

Code: Alles auswählen

Procedure VertX() 
  CallFunction(0,"getVertX") 
  ProcedureReturn 
EndProcedure 

Float.f = VertX()
Das ist genau das selbe wie "Float.f = CallFunction(0,"getVertX")", nur das es halt langsamer ist..
Bild
[url=irc://irc.freenode.org/##purebasic.de]irc://irc.freenode.org/##purebasic.de[/url]
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

Für die XLTable.dll von Knoppert hab ich einen Wrapper geschrieben, wo ich fast verzweifelt wäre:
Folgender Code liefert 0

Code: Alles auswählen

ProcedureDLL.f Excel_XLTable_GetCellAsSingle( hXLTable.l, nCol.l, nRow.l )
  ProcedureReturn PeekF(CallFunctionFast( Excel_XLTable_GetCellAsSingle, hXLTable, nCol, nRow ))
EndProcedure
Folgender Code liefert das gewünschte Float:

Code: Alles auswählen

ProcedureDLL.f Excel_XLTable_GetCellAsSingle( hXLTable.l, nCol.l, nRow.l )
  CallFunctionFast( Excel_XLTable_GetCellAsSingle, hXLTable, nCol, nRow )
  ProcedureReturn
EndProcedure
Wers nicht glaubt, den Wrapper gibts auf PureArea.net, mit weiteren Infos, sowie in diesem Thread: http://forums.purebasic.com/german/view ... e&start=10
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
ChrisB
Beiträge: 5
Registriert: 01.09.2005 16:40
Kontaktdaten:

Beitrag von ChrisB »

wow soviele Antworten. Danke.
Ich glaub aber mittlerweile das ich in der DLL was falsch gemacht habe:

Code: Alles auswählen

extern "C" __declspec(dllexport) float getVertX()
{
	float test=50.001;
	return (test);
}
Im Moment habe ich es so gelöst das ich das ganze in der DLL *1000 nehme, als long zurückgebe und in PB das ganze wieder /1000.
Das reicht für mich zwar aber ich wüsste doch gerne wo der fehler ist.
Antworten