There are several win32 functions that require the use of a string with embedded
NULLs and are terminated with an extra NULL (i will call them DZ strings for short).
An example of such a DZ string: "part1\0part2\0part3\0\0".
To name just a few of functions that work with DZ strings:
The CString class could be used to manipulate them, but you must be carefull not to call the non-DZ-aware CString-methods (such as Right(), Mid(), Left(), Replace() and Find()).
I decided to create a class that helps constructing and parsing those DZ strings. The class is called CDoubleZeroString and is not derived from CString.
An example how to use this class:
CDoubleZeroString dz; dz.Add("a=1"); // add a zeroterminated 'part' dz.Add("b=2"); dz.Add("c=3"); // operator(const char*) will return "a=1\0b=2\0c=3\0\0" WritePrivateProfileSection("humbug", dz, ".\\humbug.ini"); char buffer; GetPrivateProfileSection("humbug", buffer, sizeof buffer, ".\\humbug.ini"); // cleanup dz dz.Empty(); // AddDoubleZero will parse buffer dz.AddDoubleZero(buffer); // print the outcome for(int i=0;i<dz.GetCount();i++) cout << dz.Get(i) << endl; CString test = dz; cout << "cstring " << test << endl;This will show the following output:
The CString test will only copy the first substring when it is constructed...
If you want to implement this using CString you would have to do something like:
CString dz("a=1\0" "b=2\0" "c=3\0" "\0", 13); // or some prefer: CString dz("a=1@b=2@c=3@@"); int pos; // note that you MUST use ReverseFind (not Find) for this to work while((pos=dz.ReverseFind("@"))!=-1) dz.SetAt(pos, '\0');
Last updated: August 17, 1998