Seite 1 von 2

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

Verfasst: 25.04.2005 20:29
von ts-soft
Von einer DLL, die laut Beschreibung ein Single also 4 Byte Float zurückgibt, erhalte ich kein vernünftiges Resultat. Weiß da vielleicht jemand Rat ?

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

Verfasst: 25.04.2005 21:14
von Danilo
ts-soft hat geschrieben:Von einer DLL, die laut Beschreibung ein Single also 4 Byte Float zurückgibt, erhalte ich kein vernünftiges Resultat. Weiß da vielleicht jemand Rat ?
x = CallFunction(....)
f.f = PeekF(@x)

Meinst Du sowas? Weiß ja nicht wie Du die DLL ansprichst - z.B.
mit dem DLLimporter oder so.
CallFunction(Fast) kann aber nur Longs zurückgeben die man dann
z.B. so wie oben in Float umwandeln kann.

Verfasst: 25.04.2005 21:51
von ts-soft
@Danilo
Hab jetzt alle Varianten, einschließlich der von Dir vorgeschlagenen und komme zu keinem ergebnis. Das PowerBasic-Programm funktioniert. Dort ist der DLL-Aufruf folgendermassen deklariert:

Code: Alles auswählen

Declare Function Excel_XLTable_GetCellAsSingle Lib "XLTABLE.DLL" Alias "Excel_XLTable_GetCellAsSingle"( ByVal hXLTable As Long, ByVal nCol As Long, ByVal nRow As Long ) As Single
Ich ruf die Funktion per CallFunctionFast auf. Alle anderen Funktionen der Dll funktionieren anstandslos.
Haste noch eine andere Idee ?

Im Voraus dankend
Thomas

Verfasst: 25.04.2005 22:07
von ts-soft
Ich hab jetzt mal alle relevanten Sources auf meine alte Homepage hochgeladen. Wer Zeit und Lust hat, mir dabei zu helfen, das die beiden Funktionen mit Single auch noch gehen, kann es sich herunterladen. Soll ein DLL-Wrapper für die XLTable.dll (Freeware) von EdwinKnoppert werden.

Siehe auch: http://forums.purebasic.com/english/vie ... hp?t=14864

Danke
Thomas

Verfasst: 25.04.2005 23:01
von hardfalcon
Wir haben in PB doch auch 4Byte-Floats! Nimm doch einfach die normalen Float-Befehlevon PB, warum sollten die denn nicht gehen?

OT: Hey, die PowerBasic-Syntax erinnert mich aber sehr stark an die VB-Syntax... *magenkrämpfebekomm* Mann, bin ich froh, dass ich PureBasic habe!

[c]
Name Erweiterung Speicherverbrauch Bereich
Float .f 4 Byte im Speicher unlimitiert (siehe unten)
[/c]

//EDIT1: Den OT-Post zu einem "guten" Post umgewandelt... :mrgreen:

//EDIT2: Hatte Blödsinn geschrieben, korrigiert.

//EDIT3: Zitat aus der PB-Hilfe hinzugefügt.

Verfasst: 25.04.2005 23:11
von ts-soft
hardfalcon hat geschrieben:Wir haben in PB doch auch 4Byte-Floats! Nimm doch einfach die normalen Float-Befehlevon PB, warum sollten die denn nicht gehen?

OT: Hey, die PowerBasic-Syntax erinnert mich aber sehr stark an die VB-Syntax... *magenkrämpfebekomm* Mann, bin ich froh, dass ich PureBasic habe!
Die Declaration in VB6 sieht genauso aus, aber es funktioniert nicht. Wenn ich den entsprechenden PowerBasic Source teste, dann geht es.

Verfasst: 26.04.2005 06:48
von Danilo
ts-soft hat geschrieben:Haste noch eine andere Idee ?
Die Methode mit PeekF() ist normal richtig, ging immer so.
ts-soft hat geschrieben:Ich hab jetzt mal alle relevanten Sources auf meine alte Homepage hochgeladen.
Und jetzt soll ich mir Deine alte Homepage selbst suchen?
Auf der Page in Deinem Profil ist es jedenfalls nicht.
ts-soft hat geschrieben:Soll ein DLL-Wrapper für die XLTable.dll (Freeware) von EdwinKnoppert werden.
Mein DLL-Importer kann doch direkt die VB-Declares einlesen,
also warum nicht einfach so machen?
Brauchst eigentlich nur die Declares durchjagen, so wie das eben
auch mit z.B. FMOD gemacht wird.

Verfasst: 26.04.2005 11:56
von Falko
@Danilo

Das ist die DLL, die gemeint ist.
http://forums.purebasic.com/english/vie ... highlight=

Hier der Direktlink http://www.hellobasic.com/download/xltable.zip

Um dieses Funktion geht es eigendlich:

Code: Alles auswählen

Declare Function Excel_XLTable_GetCellAsSingleEx Lib "XLTABLE.DLL" Alias "Excel_XLTable_GetCellAsSingleEx"( ByVal hXLTable As Long, ByVal nCol As Long, ByVal nRow As Long, ByVal nRound As Long ) As Single
Same as Excel_XLTable_GetCellAsSingle() but can round the value.
Wäre schön, wenn dieses in PB auch funktionieren würde.
Dann wäre der Wrapper fertig, den ts-soft soweit geschrieben hat.

Ein Powerbasicbeispiel zeigt das es in der DLL geht.
PB spuckt nur 0.0 aus.
Auch ich möchte mich im vorraus für jede Hilfe zu diesem Wrapper
bedanken.



Gruß, Falko

Verfasst: 26.04.2005 14:35
von ts-soft
Danilo hat geschrieben:
ts-soft hat geschrieben:Haste noch eine andere Idee ?
Die Methode mit PeekF() ist normal richtig, ging immer so.
geht leider nicht
Danilo hat geschrieben:]
Und jetzt soll ich mir Deine alte Homepage selbst suchen?
Auf der Page in Deinem Profil ist es jedenfalls nicht.
Tschuldige, ich Blödmann :oops: hab vergessen den link zu posten, was ich hiermit nachhole: http://de.geocities.com/ts_softde/XLTable.zip
ts-soft hat geschrieben:Soll ein DLL-Wrapper für die XLTable.dll (Freeware) von EdwinKnoppert werden.
Danilo hat geschrieben: Mein DLL-Importer kann doch direkt die VB-Declares einlesen,
also warum nicht einfach so machen?
Brauchst eigentlich nur die Declares durchjagen, so wie das eben
auch mit z.B. FMOD gemacht wird.

Wäre schön, wenns so gehen würde, aber leider benötige ich intern Umwandlungsroutinen, da die DLL nur BSTR liefert. Der DLL-Importer fällt leider aus, lieferte mir auch nur Fehler, habs aber nur sehr kurz angetestet. Müßte dann den Wrapper nochmal Wrappen um an Nullterminierte String zu kommen. Eigentlich ist ja alles Fertig, bloß leider funktioniert das mit Single nicht so wie es sein sollte, oder ich habe einen ganz blöden Fehler drinn :freak:

Gruß
Thomas

Verfasst: 26.04.2005 15:41
von Rings
ich hab grad ein wenig rumexperimentiert.
Es kommt immer einfach ne NULL von der Funktion zurück
(Excel_XLTable_GetCellAsSingleEx)
Da kann man nix konvertieren.
Irgendwie scheint es als Edwin seinen Job nicht richtig gemacht hätte.

Was die BSTR anbetrifft, ist für mich unverständlich. Powerbasic kann auch mit normalen ASCIIZ (Normale Nullterminierte) Strings arbeiten.

Trotzdem habe ich mal meine version eines BSTR-Converters gemacht :)
(die Apis SysString etc. sind in der OLE32.dll zu finden )

Code: Alles auswählen

;{/ Globale Variablen
Global XLTable_DLL.l
Global APP_GetFileName, APP_GetInstance, APP_GetVersion, App_GetVersionString
Global BSTR_FreeMem, BSTR_GetLength, BSTR_MoveMemory
Global Excel_Destroy, Excel_FileToObject, Excel_GetSheetCount, Excel_GetSheetName
Global Excel_SaveSheetAs, Excel_SheetToXLTable, Excel_XLTable_CellIsValue
Global Excel_XLTable_Destroy, Excel_XLTable_GetCellAsSingle, Excel_XLTable_GetCellAsSingleEx
Global Excel_XLTable_GetCellAsString, Excel_XLTable_GetCellAsValue, Excel_XLTable_GetCellAsValueEx
Global Excel_XLTable_GetMaxCols, Excel_XLTable_GetMaxRows, Excel_XLTable_PutOnClipBoard, GETTEMPNAMESTR
;}

ProcedureDLL XLTable_INIT(sxlTableDLLPath.s); XLTable_DLL initialisieren
  If XLTable_DLL = 0
    ;XLTable_DLL = OpenLibrary(#PB_Any, sxlTableDLLPath)
    XLTable_DLL = LoadLibrary_(sxlTableDLLPath)
  EndIf
  If XLTable_DLL
    APP_GetFileName = GetProcAddress_(XLTable_DLL, "APP_GetFileName")
    APP_GetInstance = GetProcAddress_(XLTable_DLL, "APP_GetInstance")
    APP_GetVersion = GetProcAddress_(XLTable_DLL, "APP_GetVersion")
    App_GetVersionString = GetProcAddress_(XLTable_DLL, "App_GetVersionString")
    BSTR_FreeMem = GetProcAddress_(XLTable_DLL, "BSTR_FreeMem")
    BSTR_GetLength = GetProcAddress_(XLTable_DLL, "BSTR_GetLength")
    BSTR_MoveMemory = GetProcAddress_(XLTable_DLL, "BSTR_MoveMemory")
    Excel_Destroy = GetProcAddress_(XLTable_DLL, "Excel_Destroy")
    Excel_FileToObject = GetProcAddress_(XLTable_DLL, "Excel_FileToObject")
    Excel_GetSheetCount = GetProcAddress_(XLTable_DLL, "Excel_GetSheetCount")
    Excel_GetSheetName = GetProcAddress_(XLTable_DLL, "Excel_GetSheetName")
    Excel_SaveSheetAs = GetProcAddress_(XLTable_DLL, "Excel_SaveSheetAs")
    Excel_SheetToXLTable = GetProcAddress_(XLTable_DLL, "Excel_SheetToXLTable")
    Excel_XLTable_CellIsValue = GetProcAddress_(XLTable_DLL, "Excel_XLTable_CellIsValue")
    Excel_XLTable_Destroy = GetProcAddress_(XLTable_DLL, "Excel_XLTable_Destroy")
    Excel_XLTable_GetCellAsSingle = GetProcAddress_(XLTable_DLL, "Excel_XLTable_GetCellAsSingle")
    Excel_XLTable_GetCellAsSingleEx = GetProcAddress_(XLTable_DLL, "Excel_XLTable_GetCellAsSingleEx")
    Excel_XLTable_GetCellAsString = GetProcAddress_(XLTable_DLL, "Excel_XLTable_GetCellAsString")
    Excel_XLTable_GetCellAsValue = GetProcAddress_(XLTable_DLL, "Excel_XLTable_GetCellAsValue")
    Excel_XLTable_GetCellAsValueEx = GetProcAddress_(XLTable_DLL, "Excel_XLTable_GetCellAsValueEx")
    Excel_XLTable_GetMaxCols = GetProcAddress_(XLTable_DLL, "Excel_XLTable_GetMaxCols")
    Excel_XLTable_GetMaxRows = GetProcAddress_(XLTable_DLL, "Excel_XLTable_GetMaxRows")
    Excel_XLTable_PutOnClipBoard = GetProcAddress_(XLTable_DLL, "Excel_XLTable_PutOnClipBoard")
    GETTEMPNAMESTR = GetProcAddress_(XLTable_DLL, "GETTEMPNAMESTR")
  EndIf
EndProcedure
ProcedureDLL XLTable_Free(); DLL freigeben
  If XLTable_DLL
    ;CloseLibrary(XLTable_DLL)
     FreeLibrary_(XLTable_DLL)
  EndIf
  XLTable_DLL = 0
EndProcedure

Procedure.s GetBSTR(pBSTR.l)
 ProcedureReturn PeekS(pBSTR.l,SysStringByteLen_(pBSTR.l) )
EndProcedure

;/ Lokale Funktionen
; Procedure.s GetBSTR(pBSTR.l)
;   Protected l.l       ; Length of string
;   Protected s.s       ; Local buffer
;   l = CallFunctionFast(BSTR_GetLength, pBSTR )
;   If l > 0
;     If l > 63999
;       l = 63999
;     EndIf
;     s = Space(l)
;     CallFunctionFast(BSTR_MoveMemory, @s, pBSTR, l)
;   EndIf
;   CallFunctionFast(BSTR_FreeMem, pBSTR)
;   ProcedureReturn s
; EndProcedure
; 

;/ Exportierte Funktionen
;===================================
; Excel object
;===================================
ProcedureDLL.l Excel_FileToObject(szFileName.s)
  ProcedureReturn CallFunctionFast(Excel_FileToObject, @szFileName)
EndProcedure
ProcedureDLL.l Excel_Destroy(hObject.l); Destroys an Excel object
  ProcedureReturn CallFunctionFast(Excel_Destroy, hObject)
EndProcedure
ProcedureDLL.l Excel_GetSheetCount(hObject.l); Returns the number of sheets present in this object
  ProcedureReturn CallFunctionFast(Excel_GetSheetCount, hObject)
EndProcedure
ProcedureDLL.s Excel_GetSheetName(hObject.l, nSheet.l); Sheets are accessed by number only
  ProcedureReturn GetBSTR(CallFunctionFast(Excel_GetSheetName, hObject, nSheet))
EndProcedure
;===================================
; XLTable
;===================================
ProcedureDLL.l Excel_SheetToXLTable(hObject.l, nSheet.l); Creates a new XLTable from a sheet
  ProcedureReturn CallFunctionFast(Excel_SheetToXLTable, hObject, nSheet)
EndProcedure
ProcedureDLL.l Excel_XLTable_Destroy(hXLTable.l); Destroys an XLTable
  ProcedureReturn CallFunctionFast(Excel_XLTable_Destroy, hXLTable)
EndProcedure
ProcedureDLL.l Excel_XLTable_GetMaxCols(hXLTable.l); Returns the maximum columns for this sheet
  ProcedureReturn CallFunctionFast(Excel_XLTable_GetMaxCols,hXLTable)
EndProcedure
ProcedureDLL.l Excel_XLTable_GetMaxRows(hXLTable.l); Returns the maximum rows for this sheet
  ProcedureReturn CallFunctionFast(Excel_XLTable_GetMaxRows, hXLTable)
EndProcedure
ProcedureDLL.l Excel_XLTable_CellIsValue(hXLTable.l, nCol.l, nRow.l); Returns a boolean if the field is not text
  ProcedureReturn CallFunctionFast(Excel_XLTable_CellIsValue, hXLTable, nCol, nRow)
EndProcedure
ProcedureDLL.s Excel_XLTable_GetCellAsString(hXLTable.l, nCol.l, nRow.l); Returns the celltext, also converts a numeric cell to plain usable text
  ProcedureReturn GetBSTR(CallFunctionFast(Excel_XLTable_GetCellAsString, hXLTable, nCol, nRow))
EndProcedure
ProcedureDLL.l Excel_XLTable_GetCellAsValue(hXLTable.l, nCol.l, nRow.l); Returns a numeric fielddata with extended precision
  ProcedureReturn CallFunctionFast(Excel_XLTable_GetCellAsValue, hXLTable, nCol, nRow)
EndProcedure
ProcedureDLL.l Excel_XLTable_GetCellAsValueEx(hXLTable.l, nCol.l, nRow.l, nRound.l); Same as Excel_XLTable_GetCellAsValue() but can round the value
  ProcedureReturn CallFunctionFast(Excel_XLTable_GetCellAsValueEx, hXLTable, nCol, nRow, nRound)
EndProcedure
ProcedureDLL.f Excel_XLTable_GetCellAsSingle(hXLTable.l, nCol.l, nRow.l); Returns a numeric fielddata as single-precision floating-point
 ProcedureReturn CallFunctionFast(Excel_XLTable_GetCellAsSingle, hXLTable, nCol, nRow)
EndProcedure
ProcedureDLL.f Excel_XLTable_GetCellAsSingleEx(hXLTable.l, nCol.l, nRow.l, nRound.l); Same as Excel_XLTable_GetCellAsSingle() but can round the value
 Value=CallFunctionFast(Excel_XLTable_GetCellAsSingleEx, hXLTable, nCol, nRow, nRound)
 MessageRequester("info Back...",Hex(Value)+Chr(13)+StrU(Value,2),0)
 If Value<>0 
  Value1.f=PeekF(Value)
  MessageRequester(StrF(Value1,4),"",0)
  ProcedureReturn Value1.f
 Else
  ProcedureReturn 0
 EndIf
EndProcedure
ProcedureDLL.l Excel_XLTable_PutOnClipBoard(hXLTable.l); Places the XLTable as plain text on the clipboard
  ProcedureReturn CallFunctionFast(Excel_XLTable_PutOnClipBoard, hXLTable)
EndProcedure
;===================================
; Miscellaneous
;===================================
ProcedureDLL.l Excel_SaveSheetAs(szFileName.s, szFileOut.s, nxlFileType.l, nSheet.l); Converts a single sheet to separate filetype
  ProcedureReturn CallFunctionFast(Excel_SaveSheetAs, @szFileName, @szFileOut, nxlFileType, nSheet)
EndProcedure
ProcedureDLL.s Excel_GetVersionString(); Returns the library version as string like "1.00"
  ProcedureReturn GetBSTR(CallFunctionFast(App_GetVersionString))
EndProcedure