PowerBasic DLL Rückgabe Single (4 Byte Float) auswerten

Fragen zu allen anderen Programmiersprachen.
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 »

@Rings
Danke, ich hätte trotz #NULL weiter versucht :freak:
Deine BSTR Procedure muß ich sofort testen, kann man öfters mal gebrauchen :allright:

Und noch danke, an alle die Fehler gesucht haben. Wer auf die beiden Funktionen mit Single-Rückgabe verzichten kann, kann den Wrapper gern benutzen, bzw. mit TailBite eine UserLibrary draus machen. Für mich ist das Projekt erstmal abgeschlossen. Bringt leider nicht allzu viel.

Gruß
Thomas

Nachtrag: merkwürdigerweise funktioniert aber das PowerBasic Beispiel mit der DLL. Das kann man leider nur als gezipptes Setup unter dem link im englischem Forum laden. Die Lizenbestimmungen, so ich sie richtige verstanden haben, hindern mich aber diese mit hinzuzupacken.
Zuletzt geändert von ts-soft am 26.04.2005 16:20, insgesamt 1-mal geändert.
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
Rings
Beiträge: 977
Registriert: 29.08.2004 08:48

Beitrag von Rings »

ts-soft hat geschrieben:@Rings
Danke, ich hätte trotz #NULL weiter versucht :freak:
klar, das war allerdings das erste was ich getestet hab.
ts-soft hat geschrieben:Deine BSTR Procedure muß ich sofort testen, kann man öfters mal gebrauchen :allright:
Na ja, wie gesagt gibts alles über SYSStrings in der OLE.dll . ich finde
das ganze mehr verwirrend denn nützlich .Der einzige Nutzen ist das Diese Strings auch Unicodestrings sein können, und natürlich NULL enthalten dürfen .

Noch was am Rande,
ich habe anstatt der OpenLibrary,IsFunction die direkten Api-Befehle genutzt.
Man muss ja nicht mehr wrappen als nötig.Ausserdem gibts dann keinen Ärger wegen irgendeiner doppeltverwendeten Nummer oder so.
Nur als Hinweis für alle die mittels Tailbit DLL-Wrapper schreiben ;)
Rings hat geschrieben:ziert sich nich beim zitieren
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 »

Rings hat geschrieben: Noch was am Rande,
ich habe anstatt der OpenLibrary,IsFunction die direkten Api-Befehle genutzt.
Man muss ja nicht mehr wrappen als nötig.Ausserdem gibts dann keinen Ärger wegen irgendeiner doppeltverwendeten Nummer oder so.
Nur als Hinweis für alle die mittels Tailbit DLL-Wrapper schreiben ;)
Hast ja Recht, ist leider die Gewöhnung, das ich daran nicht gedacht habe :oops:

Gruß
Thomas
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
Danilo
-= Anfänger =-
Beiträge: 2284
Registriert: 29.08.2004 03:07

Beitrag von Danilo »

ts-soft hat geschrieben:Nachtrag: merkwürdigerweise funktioniert aber das PowerBasic Beispiel mit der DLL.
Ersetze mal die 2 betroffenen Prozeduren durch das:

Code: Alles auswählen

ProcedureDLL.f Excel_XLTable_GetCellAsSingle(hXLTable.l, nCol.l, nRow.l); Returns a numeric fielddata as single-precision floating-point
  CallFunctionFast(Excel_XLTable_GetCellAsSingle, hXLTable, nCol, nRow)
  ProcedureReturn
EndProcedure

ProcedureDLL.f Excel_XLTable_GetCellAsSingleEx(hXLTable.l, nCol.l, nRow.l, nRound.l); Same as Excel_XLTable_GetCellAsSingle() but can round the value
  CallFunctionFast(Excel_XLTable_GetCellAsSingleEx, hXLTable, nCol, nRow, nRound)
  ProcedureReturn
EndProcedure
Ich kann es nicht testen, da ich dieses MS-Office-Zeug nicht
habe und nicht brauche. Sollte aber eigentlich so richtig sein.

Effekt: Der Float-Rückgabewert der DLL-Funktion, der auf dem
FPU-Stack liegt, wird so direkt als Float zurückgegeben.
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
Benutzeravatar
Falko
Admin
Beiträge: 3535
Registriert: 29.08.2004 11:27
Computerausstattung: PC: MSI-Z590-GC; 32GB-DDR4, ICore9; 2TB M2 + 2x3TB-SATA2 HDD; Intel ICore9 @ 3600MHZ (Win11 Pro. 64-Bit),
Acer Aspire E15 (Win11 Home X64). Purebasic LTS 6.11b1
HP255G8 Notebook @AMD Ryzen 5 5500U with Radeon Graphics 2.10 GHz 3.4GHz, 32GB_RAM, 3TB_SSD (Win11 Pro 64-Bit)
Kontaktdaten:

Beitrag von Falko »

@Danilo
Wenn ich das richtig gelesen habe, kann man das auch ohne Office testen, da ja aus dem Beispiel die Exeltabelle nach .cvs umgewandelt wird. Falls dem nicht so ist, habe ich das mal getestet.

Habe beide Proceduren getauscht und im Vergleich zu Powerbasic ausprobiert.
Powerbasic hat geschrieben:Sheet: Quick Tour
Cols: 10
Rows: 188
Value$: 3591.55
Single: 3591.6
Version: 1.00
Purebasic hat geschrieben:Sheet: Quick Tour
Cols: 10
Rows: 188
Value$: 3591.55
Single: 3591.600098
Version: 1.00

MfG Falko
Bild
Win11 Pro 64-Bit, PB_6.11b1
Benutzeravatar
Danilo
-= Anfänger =-
Beiträge: 2284
Registriert: 29.08.2004 03:07

Beitrag von Danilo »

Falko hat geschrieben:@Danilo
Wenn ich das richtig gelesen habe, kann man das auch ohne
Office testen, da ja aus dem Beispiel die Exeltabelle nach .cvs
umgewandelt wird.
Das Beispiel XLTest.pb von ts-soft bringt bei mir ein "Could not open XLS",
d.h. Excel_FileToObject() schlägt fehl.

In der XLTable.chm steht aber auch schon:

Code: Alles auswählen

Notes:
  * XLTable does require Excel to be present.
    It will use the com interface of Excel to communicate
...von daher ist es schon richtig so. Man braucht dieses Excel
um XLTable nutzen zu können.
Falko hat geschrieben:Falls dem nicht so ist, habe ich das mal getestet.

[...]
Purebasic hat geschrieben:Sheet: Quick Tour
Cols: 10
Rows: 188
Value$: 3591.55
Single: 3591.600098
Version: 1.00
Danke. Scheint also nun zu funktionieren, da Single (Float)
zurückgegeben wird.


Das ganze war ein Denkfehler meinerseits. Als ich heute zufällig
in meiner 'Calling Conventions.txt' etwas überprüft habe, ist mir
dieser Topic und mein Denkfehler gleich eingefallen... :)
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
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 »

@Danilo Bild
Funktioniert hervorragend. Soll man erstmal drauf kommen bzw. da wäre ich nie drauf gekommen. Wenn man so gut wie keine ASM-Kenntnisse hat ist das auch schwer zu verstehen.
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
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 alle interessierten, die UserLib mit Source und an PureBasic angepaßten Beispiel kann im ShowCase gedownloadet werden:
XLTable DLL Wrapper Lib v.1.0


Die UserLib wurde mit TailBite 1.2 PR 1.0 erstellt (wegen Strings)

Alles scheint jetzt einwandfrei zu funktionieren, lediglich beim Runden von Floats werden die überzähligen Stellen, nach dem Runden nicht entfernt.
Zuletzt geändert von ts-soft am 12.05.2005 14:29, insgesamt 2-mal geändert.
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
Falko
Admin
Beiträge: 3535
Registriert: 29.08.2004 11:27
Computerausstattung: PC: MSI-Z590-GC; 32GB-DDR4, ICore9; 2TB M2 + 2x3TB-SATA2 HDD; Intel ICore9 @ 3600MHZ (Win11 Pro. 64-Bit),
Acer Aspire E15 (Win11 Home X64). Purebasic LTS 6.11b1
HP255G8 Notebook @AMD Ryzen 5 5500U with Radeon Graphics 2.10 GHz 3.4GHz, 32GB_RAM, 3TB_SSD (Win11 Pro 64-Bit)
Kontaktdaten:

Beitrag von Falko »

ts-soft hat geschrieben:....Alles scheint jetzt einwandfrei zu funktionieren, lediglich beim Runden von Floats werden die überzähligen Stellen, nach dem Runden nicht entfernt.
Man könnte ja noch im Testsource mogeln, damit es so aussieht wie in Powerbasic :mrgreen:

Code: Alles auswählen

MsgBox + "Single:  " + Chr( 9 ) + StrF(Excel_XLTable_GetCellAsSingleEx( hXLTable, 2, 5, 1 ),1) + #CRLF$
Aber das wäre nicht Sinn der Sache, wenn man die konvertierte Tabelle weiter benutzen wollte. Im Wrapper habe ich StrF(singleFunktion,1) probiert, dazu muss ich ein Ergebniss zurückgeben, dann wäre das das gleiche Spiel wie vor Danilos SuperTip :allright:

Gruß Falko
Bild
Win11 Pro 64-Bit, PB_6.11b1
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 »

Falko hat geschrieben: Man könnte ja noch im Testsource mogeln, damit es so aussieht wie in Powerbasic :mrgreen:

Code: Alles auswählen

MsgBox + "Single:  " + Chr( 9 ) + StrF(Excel_XLTable_GetCellAsSingleEx( hXLTable, 2, 5, 1 ),1) + #CRLF$
Aber das wäre nicht Sinn der Sache
Doch, dieses ist der Sinn des Rundens. Dein Tip ist schon eine guter Lösungsansatz. Da ich lediglich einen Wrapper gemacht habe, hab ich es auch nicht weiter angepasst. Die Mini-Floats von PB sind IMHO mehr eine Notlösung.
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
Antworten