Als software ontwikkelaar ben je je al weer aan het voorbereiden voor de volgende opdracht,terwijl de huidige nog niet eens klaar is. Dus was aan het kijken op de site van
dotnet for devices. Daar stond een stukje voorbeeld code met een klassieke “fout” er in.
Available memory in PocketPC and CF Flash.
Description: The available memory of a PocketPC can be found, calling the API GetDiskFreeEx. The first parameter to this API is a path to a particular directory. For the device itself, this path is the root directory. If a storage card is inserted this path should be: [\storage card]. In the following code snippet we show how to create a little class with a static member function to obtain availabe storage memory, making use of P/Invoke in combination with the GetDiskFreeEx API.
Code:
public class MemStatus
{
[DllImport("coredll.dll")]
public static extern bool GetDiskFreeSpaceEx (
string lpDirectoryName,
out ulong lpFreeBytesAvailableToCaller,
out ulong lpTotalNumberOfBytes,
out ulong lpTotalNumberOfFreeBytes);
public const string STORAGE_INTERNAL = "\\";
public const string STORAGE_FLASH_CARD =
"\\storage card\\";
public MemStatus()
{
}
public static bool GetStorageInfo (
string storagePath,
out ulong totalBytes,
out ulong availBytes)
{
ulong freeBytesAvail;
ulong totalBytesAvail;
ulong freeBytesTotal;
bool result = GetDiskFreeSpaceEx (storagePath,
out freeBytesAvail,
out totalBytesAvail,
out freeBytesTotal);
if (result == true)
{
totalBytes = ulong.totalBytesAvail;
availBytes = ulong.freeBytesAvail;
}
else
{
totalBytes = ulong.MaxValue;
availBytes = ulong.MaxValue;
}
return result
}
}
// Call this sample code like this:
int totalBytes;
int availBytes;
if (MemStatus.GetStorageInfo(
MemStatus.STORAGE_FLASH_CARD,
out totalBytes,
out availBytes))
{
label1.Text = totalBytes.ToString();
label2.Text = availBytes.ToString();
}
else
{
label1.Text = "?";
label2.Text = "?";
}
Vandaag stond op de weblog van
Maarten Struys al een reactie, zie hieronder..
What was I thinking a long time ago? I showed a little code snippet to retrieve the available memory on a Windows CE device and / or a CF card, using the GetDiskFreeEx API. It turns out that about the only correct thing in the snippet was the declaration to properly P/Invoke into the API. The API returns pointers to large, unsigned integers and in the code snippet I converted them to integers. Thanks to Rene Teunissen the code snippet is now modified and takes ulongs in managed code. What can I say? I guess I am getting too old for this industry, having to deal with storage devices of over 2 GB.
Leuk, vooral hij je zo een veer ergens probeert te steken. Al voelt deze veer wel prettig

Waar het om gaat? Dit voorbeeld geeft aan hoe je in Windows -CE - inderdaad het windows op die handheld computers, zoals de
HP-Ipaq, in software kunt zien hoeveel ruimte er nog vrij is op een (hard)disk of geheugenkaartje. En die heb je regelmatig nodig als je bijvoorbeeld bestanden (foto’s) wilt kopieren, dan moet je eerst kijken of wel voldoende vrije ruimte is voor de bestanden.
In het getergde voorbeeld wordt per ongeluk de verkregen informatie afgerond op de grootte van een “integer”. Een integer is een variable die maximaal 31-bits getallen aan kan. Of te wel - voor de leken onder ons - geen getallen kan representeren groter dan grofweg 2 miljard (eigelijk 2 tot de macht 31).
Nu lijkt dat erg groot, maar geheugenkaarten worden steeds groter en als je een geheugenkaart van 2GB niet meer kunt ondersteunen, loop je al snel tegen de lamp. Wellicht omdat 4GB (grofweg 4 miljard bytes) al wel gebruik worden in foto camera’s. Je kunt er op wachten totdat ze gemeengoed worden of dat je apparaat gebruikt gaat worden door mensen die nu iets meer te besteden hebben, en dus gelijk de grotere geheugenkaarten kopen.
Als je er dan achter komt dat je een product gekocht hebt met en dergelijke fout er in, dan baal je goed, want dan kun je de kaart mogelijk niet eens optimaal gebruiken.. probeer dan maar een (selctie) van bestanden grotes dan 2GB te kopieren. Nu lijkt dat ongewoon, maar kijk eens in de nabije toekomst, dan zullen dergelijke (foto)bestand selecties of MP3 verzamelingen gemeengoed worden.
Is het erg wat hier is gebeurd? Nee, het gaat hier om een voorbeeld, of te wel hoe je een dergelijk proboleem zou kunnen oplossen. Iemand die dergelijke voorbeelden bekijkt en overneemt moet zich realiseren dat deze code deze beperkingen kent. En iedere software ontwikkelaar hoort te weten dat signed integers maximaal 32 bits breed zijn, waarvan je er 31 kunt gebruiken voor je getallen (1 bit wordt gebruikt om aan te geven of het getal positief of negatief is)….
Een ding is wel zeker, de site van
Maarten is zeer zeker de moeite waard. Al was het maar omdat Maarten één van de twee in Nederland verblijvende die-hard Windows-CE ontwikkelaars is die door
Microsoft eMVP certificaat heeft gekregen. En die krijg je niet zo maar.