Derzeit arbeite ich an einer Anbindung für eine TSE-Stick an Software. Die Software scheint mir nützlich genug zu sein, um versuchen es anzubieten. Wenn also daran mal Interesse bestehen sollte. ... ;_)
Nun denn, während dieser Entwiicklung war es nötig die Laufwerke zu finden. Vielleicht gibt es da was eingebautes in Windev, ich bin aber über die WIN API gegangen
Das ist der code der da rauskam:
Code: Alles auswählen
FUNCTION getLogicalDrives(): array of strings
arrDrives is array of string
FunctionReturnVal is int // C type:DWORD
nBufferLength is int = 150 // C type:DWORD
sLpBuffer is Buffer on 150
nCountDoubleDots is int
// Prototype of the function: DWORD WINAPI GetLogicalDriveStringsA( DWORD nBufferLength, LPSTR lpBuffer );
GetLogicalDriveStringsA is API Description
GetLogicalDriveStringsA.NomDLL = "kernel32.dll"
GetLogicalDriveStringsA.NomFonction = "GetLogicalDriveStringsA"
GetLogicalDriveStringsA.Parameter[1].Type = apiInt_4 // nBufferLength
GetLogicalDriveStringsA.Parameter[2].Type = apiInt_4 // lpBuffer
FunctionReturnVal = GetLogicalDriveStringsA(nBufferLength, &sLpBuffer)
// dbgCheckEqual(FunctionReturnVal, Length(sLpBuffer))
// return value of this function looks like this:
// C:\<0>D:\<0>E:\<0>H:\<0>P:\<0><0><0><0><0><0><0><0>
// to split that one has to do it this way:
nCountDoubleDots = StringCount(sLpBuffer, ":")
let sToSplitAt = "\"+Charact(0)
arrDrives = StringSplit(sLpBuffer,sToSplitAt)
// now there is one element more then drives in the above case
// D:,D:,E:,H:,P:;00
// so yeah we've to cut the last element Joy of nullterminated strings in an array separated by NULL!
arrDrives.Delete(LastElement)
dbgCheckEqual(nCountDoubleDots, arrDrives.Count)
RESULT = arrDrives
Sagen wir mal so - es hat gedauet.
Dann fiel mir aber auch ein, daß man .NET auch benutzen kann. Hier war am schwierigsten die Deklarationen auf die Reihe zu bekommen. Da bin ich mir immer noch nicht sicher. z.b war mache ich wenn ich einen NameSpace wie System.IO in WinDev deklarierenwill. Wie auch immer, der code für .NET sieht so aus:
Code: Alles auswählen
PROCEDURE getLogicalDrivesBDN(): array of string
arrDrivesFromDotNet is array dynamic of 0 "System.IO.DriveInfo" dynamic
arrResult is array of string
sWithoutSlash is string
arrDrivesFromDotNet = System.IO.DriveInfo.GetDrives()
FOR EACH di IN arrDrivesFromDotNet
sWithoutSlash = di.get_Name()
arrResult.Add(sWithoutSlash.NoRightCharacter("\"))
END
RETURN arrResult
Der Code dafür:
Code: Alles auswählen
let nRuns = 100000
let startTime = TimeSys()
FOR i = 1 TO nRuns
arrDrivesFromDotNet =getLogicalDrivesBDN()
END
let endTime =TimeSys()
Trace("Laufzeit ...NET :" + TimeDifference(startTime,endTime))
let startTimeAPI = TimeSys()
FOR i = 1 TO nRuns
arrRetVal = getLogicalDrives()
END
let EndTimeAPI =TimeSys()
Trace("Laufzeit ...API :" + TimeDifference(startTimeAPI,EndTimeAPI))
Und trotzdem
1019-14xx / 100 = 1,019 s für .NET
597- 800 / 100 = 0.6 für API.
API ist "schneller" aber man, was sind unsere Rechner heute schnell geworden
Die Bequemlichkeit und Einfachheit spricht für mich klar für .NET. Wenn's aber mal wirklich pressiert sollte man die API nicht vergessen. Die Integration in WinDev finde ich recht gelungen BTW. Die wizzards helfen ganz ungemein.