PowerBasic DLL Rückgabe Single (4 Byte Float) auswerten
Verfasst: 25.04.2005 20:29
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 ?
Das deutsche PureBasic-Forum
https://www.purebasic.fr/german/
x = CallFunction(....)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 ?
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
Die Declaration in VB6 sieht genauso aus, aber es funktioniert nicht. Wenn ich den entsprechenden PowerBasic Source teste, dann geht es.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 Methode mit PeekF() ist normal richtig, ging immer so.ts-soft hat geschrieben:Haste noch eine andere Idee ?
Und jetzt soll ich mir Deine alte Homepage selbst suchen?ts-soft hat geschrieben:Ich hab jetzt mal alle relevanten Sources auf meine alte Homepage hochgeladen.
Mein DLL-Importer kann doch direkt die VB-Declares einlesen,ts-soft hat geschrieben:Soll ein DLL-Wrapper für die XLTable.dll (Freeware) von EdwinKnoppert werden.
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.
geht leider nichtDanilo hat geschrieben:Die Methode mit PeekF() ist normal richtig, ging immer so.ts-soft hat geschrieben:Haste noch eine andere Idee ?
Tschuldige, ich BlödmannDanilo hat geschrieben:]
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.
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.
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