Seite 2 von 2

Verfasst: 01.09.2005 18:27
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?

Verfasst: 01.09.2005 18:37
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.

Verfasst: 01.09.2005 18:41
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?

Verfasst: 01.09.2005 19:51
von AndyX
Wenn man nur ProcedureReturn schreibt, wird automatisch der Wert in eax genommen :allright:

Verfasst: 01.09.2005 19:56
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..

Verfasst: 01.09.2005 20:17
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

Verfasst: 01.09.2005 21:16
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.