Click here to Skip to main content
Click here to Skip to main content

Cross-platform INI Configuration Files (Win32/Un*x, MBCS/Unicode)

By , 27 Feb 2012
 

A cross-platform library that provides a simple API to read and write INI-style configuration files. It supports data files in ASCII, MBCS and Unicode. It is designed explicitly to be portable to any platform and has been tested on Windows and Linux. It has been released as open-source and free using the MIT licence.

Features

  • MIT Licence allows free use in all software (including GPL and commercial)
  • Multi-platform (Windows 95*/98/ME/NT/2K/XP/2003, Windows CE, Linux, Unix)
  • Loading and saving of INI-style configuration files
  • Liberal acceptance of file format
    • Key/values with no section
    • Removal of whitespace around sections, keys and values
    • Configuration files can have any newline format on all platforms
  • Optional support for multi-line values (values with embedded newline characters)
  • Optional support for multiple keys with the same name (keys with multiple values)
  • Optional case-insensitive sections and keys (for ASCII characters only)
  • Saves files with sections and keys in the same order as they were loaded
  • Preserves comments on the file, section and keys where possible
  • Supports both char or wchar_t programming interfaces
  • Supports both MBCS (system locale) and UTF-8 file encodings
  • System locale does not need to be UTF-8 on Linux/Unix to load UTF-8 file
  • Support for non-ASCII characters in section, keys, values and comments
  • Support for non-standard character types or file encodings via user-written converter classes
  • Support for adding/modifying values programmatically
  • Compiles cleanly at warning level 4 (Windows/VC.NET 2003), warning level 3 (Windows/VC6) and -Wall (Linux/gcc)

Download

Get the latest information and the latest version from the homepage here

Usage Summary

  1. Define the appropriate symbol for the converter you wish to use and include the SimpleIni.h header file. If no specific converter is defined, then the default converter is used. The default conversion mode uses SI_CONVERT_WIN32 on Windows and SI_CONVERT_GENERIC on all other platforms. If you are using ICU then SI_CONVERT_ICU is supported on all platforms.
  2. Declare an instance the appropriate class, e.g. CSimpleIni for TCHAR, CSimpleIniA for char, CSimpleIniW for wchar_t. Other types (e.g. unsigned short, unsigned char) are also possible.
  3. Call LoadFile() to load and parse the INI configuration file
  4. Access the data of the file using the following functions:
    GetAllSections Return all section names
    GetAllKeys Return all key names for a section
    GetSection Return all key names and values in a section
    GetSectionSize Return the number of keys in a section
    GetValue Return a value for a section & key
    GetAllValues Return all values for a section & key
    SetValue Add or update a value for a section & key
    Delete Remove a section, or a key from a section
  5. Call Save() or SaveFile() to save the INI configuration data (as necessary).

Examples

These snippets are included with the distribution in the file snippets.cpp.

LOADING DATA

Load from a data file:

CSimpleIniA ini(a_bIsUtf8, a_bUseMultiKey, a_bUseMultiLine);
SI_Error rc = ini.LoadFile(a_pszFile);
if (rc < 0) return false;

Load from a string:

std::string strData;
rc = ini.Load(strData.c_str(), strData.size());
if (rc < 0) return false;

GETTING SECTIONS AND KEYS

Get all sections:

CSimpleIniA::TNamesDepend sections;
ini.GetAllSections(sections);

Get all keys in a section:

CSimpleIniA::TNamesDepend keys;
ini.GetAllKeys("section-name", keys);

GETTING VALUES

Get the value of a key:

const char * pszValue = ini.GetValue("section-name", 
    "key-name", NULL /*default*/);

Get the value of a key which may have multiple values. If bHasMultipleValues is true, then just one value has been returned.

bool bHasMultipleValues;
pszValue = ini.GetValue("section-name", "key-name", 
    NULL /*default*/, &bHasMultipleValues);

Get all values of a key with multiple values:

CSimpleIniA::TNamesDepend values;
ini.GetAllValues("section-name", "key-name", values);

Sort the values into the original load order:

values.sort(CSimpleIniA::Entry::LoadOrder());

Output all of the items:

CSimpleIniA::TNamesDepend::const_iterator i;
for (i = values.begin();; i != values.end(); ++i) { 
    printf("key-name = '%s'\n", i->pItem);
}

MODIFYING DATA

Adding a new section:

rc = ini.SetValue("new-section", NULL, NULL);
if (rc < 0) return false;
printf("section: %s\n", rc == SI_INSERTED ? 
    "inserted" : "updated");

Adding a new key ("new-section" will be added automatically if it doesn't already exist):

rc = ini.SetValue("new-section", "new-key", "value");
if (rc < 0) return false;
printf("key: %s\n", rc == SI_INSERTED ? 
    "inserted" : "updated");

Changing the value of a key:

rc = ini.SetValue("section", "key", "updated-value");
if (rc < 0) return false;
printf("key: %s\n", rc == SI_INSERTED ? 
    "inserted" : "updated");

DELETING DATA

Deleting a key from a section. Optionally the entire section may be deleted if it is now empty:

bool bDeleteSectionIfEmpty = false;
ini.Delete("section-name", "key-name", 
    true /*delete the section if empty*/);

Deleting an entire section and all keys in it:

ini.Delete("section-name", NULL);

SAVING DATA

Save the data to a string:

rc = ini.Save(strData);
if (rc < 0) return false;

Save the data back to the file:

rc = ini.SaveFile(a_pszFile);
if (rc < 0) return false;

MIT Licence

The licence text below is the boilerplate "MIT Licence" used from here.

Copyright (c) 2006, Brodie Thiesfield

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

License

This article, along with any associated source code and files, is licensed under The MIT License

About the Author

brofield
Web Developer
Australia Australia
Member
Must eat, enjoy travel, thus programming since 1995. Donations of canned food gladly accepted.

Sign Up to vote   Poor Excellent
Add a reason or comment to your vote: x
Votes of 3 or less require a comment

Comments and Discussions

 
You must Sign In to use this message board.
Search this forum  
    Spacing  Noise  Layout  Per page   
QuestionFails to save INI file [modified]memberandreaplanet5 Feb '12 - 10:00 
Build with
- Visual Studio 2005, 32 bit, Unicode
- Linked with ICU Library
#define SI_CONVERT_ICU
#include "SimpleIni.h"
CSimpleIni ini(true, false, false);
 
When saving a INI File that contains a Key with an Empty string value, the procedure will fail. The error happens when converting the empty string value at line 3119:
nError = U_ZERO_ERROR;
ucnv_resetFromUnicode(m_pConverter);
int32_t nLen = ucnv_fromUChars(m_pConverter, NULL, 0,
    a_pInputData, -1, &nError);
if (nError != U_BUFFER_OVERFLOW_ERROR) {
    return (size_t) -1;
}
 
P.S.: When commenting #define SI_CONVERT_ICU the issue disappears.

modified 5 Feb '12 - 16:23.

AnswerRe: Fails to save INI filememberbrofield26 Feb '12 - 13:30 
Thanks. Bug fix version 4.15 at http://code.jellycan.com/simpleini/[^]
GeneralNon-ASCII charactersmemberJeff Dunlap10 Jul '09 - 9:20 
Hi Brodie,
 
Thank you for your excellent library!
 
I'm currently using it on INI files containing regular ASCII characters. To be honest, I am not familiar with using Unicode or other character types. Would UTF-8 do the trick for special characters such as ñ and Ñ? If so, would you be so kind to post some basic snippets that I can work with those special characters?
 
Best Regards,
 
Jeff
GeneralRe: Non-ASCII charactersmemberbrofield11 Jul '09 - 1:05 
I recommend that you study up on Unicode.
The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets[^]
 
To use it, set the Unicode mode on (which means that it will save and load in UTF-8) and then use either the char* version with UTF-8 strings, or the wchar_t version.
 
Cheers,
Brodie
GeneralBuilding under CEmembercstup1 Dec '08 - 12:06 
When compiling under CE SDK 4.2, I get the following link errors:
 
XXX.OBJ : error LNK2019: unresolved external symbol "void __stdcall `eh vector destructor iterator'(void *,unsigned int,int,void (__thiscall*)(void *))" (??_M@YGXPAXIHP6EX0@Z@Z) referenced in function "public: void __thiscall std::list,class SI_ConvertW >::Entry,class std::allocator,class SI_ConvertW >::Entry> >::sort(void)" (?sort@?$list@UEntry@?$CSimpleIniTempl@GU?$SI_GenericNoCase@G@@V?$SI_ConvertW@G@@@@V?$allocator@UEntry@?$CSimpleIniTempl@GU?$SI_GenericNoCase@G@@V?$SI_ConvertW@G@@@@@std@@@std@@QAEXXZ)
 
XXX.OBJ : error LNK2019: unresolved external symbol "void __stdcall `eh vector constructor iterator'(void *,unsigned int,int,void (__thiscall*)(void *),void (__thiscall*)(void *))" (??_L@YGXPAXIHP6EX0@Z1@Z) referenced in function "public: void __
thiscall std::list,class SI_ConvertW >::Entry,class std::allocator,class SI_ConvertW >::Entry> >::sort(void)" (?sort@?$list@UEntry@?$CSimpleIniTempl@GU?$SI_GenericNoCase@G@@V?$SI_ConvertW@G@@@@V?$allocator@UEntry@?$CSimpleIniTempl@GU?$SI_GenericNoCase@G@@V?$SI_ConvertW@G@@@@@std@@@std@@QAEXXZ)
 
Ack! It appears to be complaining about an internal issue with the STL, but I can't narrow it down.
 
Compiling for with the 5.0 SDK it compiles just fine....
 
Anyone have any ideas?

GeneralProblems with GetValuememberhitesh_sharma29 Apr '07 - 11:44 
Hello,
 
I'm not able to load value from the INI file. This is what I'm trying:
 

CSimpleIni iniSettings;
SI_Error rc = iniSettings.Load ("C:\\sample.ini");
AfxMessageBox (iniSettings.GetValue ("Syntax", "IgnoreCase", NULL));
 

 
The content of the message box is empty. Sample.ini is the sample file provide by you - http://code.jellycan.com/files/ini.syn[^]. What wrong I'm doing here??
GeneralRe: Problems with GetValuememberbrofield29 Apr '07 - 15:08 
> What wrong I'm doing here??
 
Read the documentation closer, or step into the method call with a debugger. You use LoadFile to load a file. Load() supplies the data directly.
 
Brodie
GeneralRe: Problems with GetValuememberhitesh_sharma29 Apr '07 - 18:12 
Oh, it was 3.30 in the morning when I was working and thus screwed myself. Sorry for the trouble caused.
 
Thanks,
Hitesh
GeneralNo success with PocketPC versionmemberddtm29 Jan '07 - 7:56 
I have a project that is compiled for both Windows and WindowsCE platforms. Windows version works perfectly, but version for PocketPC doesn't work at all. There are a lot of warnings (WM2005 and WM2003) and several uresolved externals (WM2003). WM2005 version of .exe just throws an exception.
I use MSVS2005 and proper SDKs to compile PocketPC versions.
GeneralRe: No success with PocketPC versionmemberbrofield29 Jan '07 - 8:14 
Point me to some resources that tell me how to set up a development environment for Windows CE and I will test it out.
GeneralRe: No success with PocketPC versionmemberddtm29 Jan '07 - 8:40 
http://www.microsoft.com/downloads/details.aspx?FamilyID=83a52af2-f524-4ec5-9155-717cbe5d25ed&DisplayLang=en[^] --- This is WM2005 SDK (sample projects and emulator included)
 
http://www.microsoft.com/downloads/details.aspx?familyid=9996B314-0364-4623-9EDE-0B5FBB133652&displaylang=en[^] --- This is WM2003 SDK (sample projects included)
 
There is an built-in emulator and SDK for WM2003 in MSVS2005. You should download WM2003 SDK only if you want to get sample projects for this OS
GeneralRe: No success with PocketPC versionmemberddtm30 Jan '07 - 6:57 
I've managed to build project for WM2005 --- I've forgot that full paths must be passed to fopen/_wfopen for proper opening.
But there is still no success with WM2003.
I get:
Constants.obj : error LNK2019: unresolved external symbol "public: __cdecl std::exception::exception(char const *)" (??0exception@std@@QAA@PBD@Z) referenced in function "public: __cdecl std::bad_alloc::bad_alloc(char const *)" (??0bad_alloc@std@@QAA@PBD@Z)
libcpmt.lib(string.obj) : error LNK2001: unresolved external symbol "public: __cdecl std::exception::exception(char const *)" (??0exception@std@@QAA@PBD@Z)
Constants.obj : error LNK2001: unresolved external symbol "public: virtual char const * __cdecl std::exception::what(void)const " (?what@exception@std@@UBAPBDXZ)
libcpmt.lib(string.obj) : error LNK2001: unresolved external symbol "public: virtual char const * __cdecl std::exception::what(void)const " (?what@exception@std@@UBAPBDXZ)
Constants.obj : error LNK2019: unresolved external symbol "public: virtual __cdecl std::exception::~exception(void)" (??1exception@std@@UAA@XZ) referenced in function "public: virtual __cdecl std::bad_alloc::~bad_alloc(void)" (??1bad_alloc@std@@UAA@XZ)
libcpmt.lib(string.obj) : error LNK2001: unresolved external symbol "public: virtual __cdecl std::exception::~exception(void)" (??1exception@std@@UAA@XZ)
Constants.obj : error LNK2001: unresolved external symbol "const type_info::`vftable'" (??_7type_info@@6B@)
libcpmt.lib(string.obj) : error LNK2001: unresolved external symbol "const type_info::`vftable'" (??_7type_info@@6B@)
Constants.obj : error LNK2001: unresolved external symbol "public: __cdecl std::exception::exception(class std::exception const &)" (??0exception@std@@QAA@ABV01@@Z)
libcpmt.lib(string.obj) : error LNK2001: unresolved external symbol "public: __cdecl std::exception::exception(class std::exception const &)" (??0exception@std@@QAA@ABV01@@Z)
Constants.obj : error LNK2019: unresolved external symbol "public: __cdecl std::exception::exception(void)" (??0exception@std@@QAA@XZ) referenced in function "public: __cdecl std::logic_error::logic_error(class std::basic_string,class std::allocator > const &)" (??0logic_error@std@@QAA@ABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@1@@Z)
libcpmt.lib(string.obj) : error LNK2001: unresolved external symbol "public: __cdecl std::exception::exception(void)" (??0exception@std@@QAA@XZ)
Pocket PC 2003 (ARMV4)\Release/WM2005.exe : fatal error LNK1120: 6 unresolved externals
P.S. Sorry for noob questions...
GeneralRe: No success with PocketPC versionmemberbrofield30 Jan '07 - 7:09 
These are not warnings or errors associated with SimpleIni per se, rather they are referencing the memory allocation failure exceptions of new. This may be caused by your use of SimpleIni. Send me your email address via http://code.jellycan.com/comments/
GeneralRe: No success with PocketPC versionmemberGeno Roupsky30 Aug '07 - 3:33 
I had a problem compiling with VS2005 for PocketPC 2003 (ARM4). And I fixed it with this change:
 
Index: SimpleIni.h
===================================================================
--- SimpleIni.h (original)
+++ SimpleIni.h (modified)
@@ -1108,7 +1108,7 @@
{
#ifdef _WIN32
FILE * fp = NULL;
-#if __STDC_WANT_SECURE_LIB__
+#if __STDC_WANT_SECURE_LIB__ && !_WIN32_WCE
_wfopen_s(&fp, a_pwszFile, L"rb");
#else
fp = _wfopen(a_pwszFile, L"rb");

 
Geno Roupsky
GeneralRe: No success with PocketPC versionmemberbrofield30 Aug '07 - 4:20 
Thanks for your contribution. Are you sure that this change isn't needed at all locations that I test for __STDC_WANT_SECURE_LIB__ ?
 
Brodie
Questioncan it support this ?membercv2223 Dec '06 - 20:57 
i have a ini config file.the content in below:
 
[dxfcv222]
key1
key2
key3
key4
 
can this ini config class support to read this ?Smile | :)
 
dxf

AnswerRe: can it support this ?memberbrofield4 Dec '06 - 1:29 
No because it isn't really an INI file. It would consider each of those lines to be invalid as they don't have a value. i.e. no equals sign. If you put an equals sign after them then the file would be fine.
GeneralSave commentsmemberKwint30 Nov '06 - 20:40 
Hi
 
It is a very useful sollution...
But, to use it in my projects, i need to keep ini file format untouched: comments should be kept in the edited files, as well as section and key order
 
Maybe you'r planning to add this kind of feature to your lib ? Smile | :)
GeneralRe: Save commentsmemberbrofield1 Dec '06 - 12:04 
Obviously it doesn't modify the file when it reads it, only when writing. I have no intention to add this functionality as it would require a fairly substantial rework to the library. You are welcome to extend this library to add the functionality. If you supply the changes to me then I can merge them back in as well.
 
Cheers,
Brodie
GeneralRe: Save commentsmemberbrofield21 Jan '07 - 15:21 
This functionality has been added in version 4.0. It now saves comments (with some limitations), and will write sections and keys back out in the same order that they were read in. See the documentation at http://code.jellycan.com/simpleini/ for details.
 
Cheers,
Brodie
GeneralHelp! errorsmemberAndroides10 Oct '06 - 22:54 
Hello, I'm getting the following errors:
 
error LNK2019:
unresolved external symbol _setlocale referenced in function _wmain
 
error LNK2019:
unresolved external symbol _WinMain referenced in function _WinMainCRTStartup
 
fatal error LNK1120: 2 unresolved externals
 
Tank you in advance.

GeneralRe: Help! errorsmemberbrofield11 Oct '06 - 22:13 
This is nothing to do with my library. You have created a windows application instead of a console application. Create the project again and specify console app as the type. If you are trying to compile the test app then just use the project that I supplied.
Generalreportmemberplauger8 Aug '06 - 23:33 
use the std::map to manage setions will change their order, when regenerate a ini copy after update content.
GeneralRe: reportmemberbrofield8 Aug '06 - 23:39 
Yes. There is no guarantee on the order that items are presented to you. This is specifically noted in the documentation. That's the way of INI files - order doesn't matter. If you want it to matter, then number your keys. Sections should never matter.
 
// NOTES
// =====
...
// * The collation (sorting) order used for sections and keys returned from
// iterators is NOT DEFINED. If collation order of the text is important
// then it should be done yourself by either supplying a replacement
// SI_STRLESS class, or by sorting the strings external to this library.

 
Regards,
Brodie
GeneralRe: reportmemberbrofield21 Jan '07 - 15:25 
The functionality to preserve section and key order has been added in version 4.0. It now saves comments (with some limitations), and will write sections and keys back out in the same order that they were read in. See the documentation at http://code.jellycan.com/simpleini/ for details.
 
Cheers,
Brodie
Generalboostmemberjuggler28 Jul '06 - 5:37 
This is nice, but potential users should also consider boost::program_options (http://www.boost.org) which does a very similar thing, but is perhaps more complete and deals with the command-line too. It's not tied to the ini file format, though.
NewsRe: boostmemberAnonymuos28 Jul '06 - 22:21 
juggler wrote:
This is nice, but potential users should also consider boost::program_options

 
Nope, this INI file code is a practical utility for a practical purpose. Don't waste your time with Boost.
 

GeneralRe: boostmemberbrofield1 Aug '06 - 18:21 
Boost is a great library providing lots of solutions for different problems. If you are already using it in a project then it might work well for you. However there is a reasonably steep learning curve to using it in a project.
 
The whole idea of SimpleIni is that it gives a lightweight yet comprehensive INI file support in a single file. Download it, include it in your C++ file and then start reading and writing INI files. The interface is (hopefully) much easier to use.
 
I also have cross-platform command line option support (and option glob support) in a single file via SimpleOpt.
 
There are many tools for many tasks. Pick the one that suits you best.
 
Regards,
Brodie
GeneralNew feature: multiple keysmemberbrofield19 Jun '06 - 3:45 
I've just updated this to add the ability to optionally have multiple keys with the same name. This allows INI files with the following sort of structure.
 
[section]
key=value1
key=value2
key=value3
 
When SetMultiKeys is true, this file will be loaded with "key" having 3 entries. If SetMultiKeys is false, then "key" will have only the last value of "value3".
QuestionPossible in EVC4?memberRotlaus216 Jun '06 - 10:44 
Is it possible to use this on a Pocket PC under EVC4? The Compiler says i have no mbstring.h and no errno.h
AnswerRe: Possible in EVC4?memberbrofield16 Jun '06 - 19:05 
Try version 2.4 which has just been uploaded to the main homepage at http://code.jellycan.com/simpleini/
 
I have provided a couple of extra defines, SI_NO_ERRNO and SI_NO_MBCS which should remove the headers and usage of those headers that was causing the problem for you. These defines are automatically set on Windows CE builds. Let me know if it doesn't fix the problem.
GeneralVery UsefulmemberNguyen Quoc Hung9 Jun '06 - 4:38 
Great article. Thanks for sharing. I find your code very useful.
 
I would suggest adding the definition for CSimpleIniCase in the end block of your source code for completeness. I prefer to use case-sensitive labels for ease of reading in the INI file.
 

#ifdef _UNICODE
# define CSimpleIni CSimpleIniW
# define CSimpleIniCase CSimpleIniCaseW
# define SI_NEWLINE SI_NEWLINE_W
#else // !_UNICODE
# define CSimpleIni CSimpleIniA
# define CSimpleIniCase CSimpleIniCaseA
# define SI_NEWLINE SI_NEWLINE_A
#endif // _UNICODE

 
Thanks,
 
_Hung_
GeneralRe: Very Usefulmemberbrofield9 Jun '06 - 17:56 
Thanks for your comments. I've updated it at the main website http://code.jellycan.com/simpleini/ to have those definitions plus another change that I had been working on.
 
Regards,
Brodie
QuestionRemoval?memberneocryptek26 May '06 - 15:08 
Great little ini parser!
 
Is there any reason why there is no support for removal of keys/sections, besides maybe simplicity? While I agree that it is not as common to need such, but it only seems logical to provide it to match the add capabilities.
 
Also, I notice you have facilities to load in a string, but not to retrieve one back out. Yes, the example shows basically how to do this, but it would be nice to have it built in to avoid the extra copy.
 
Other than those minor nit-picky things, nice work!
Currently creating a wrapper for both your simple* classes [ini with cmd line overrides] configuration system for my project.
AnswerRe: Removal?memberbrofield26 May '06 - 18:54 
I agree that both features would be useful and round out the functionality. I have updated it.
* Delete() to remove keys or entire sections
* Save() to write INI data to a general output writer
* SaveFile() to write INI data to a file
* SaveString() to write INI data to a std::string
* GetConverter() to get a converter object which will convert SI_CHAR to the appropriate output format so that you can prepend or append your own text to the output INI data.
 
Tested on Windows/Linux and a few different compilers.
 
Cheers,
Brodie
GeneralRe: Removal?memberneocryptek26 May '06 - 20:36 
Wow you are fast!
 
Thank you very much!
Questionlinux working ?memberneilcostigan22 May '06 - 10:25 
hi,
 
code looks great !
 
but i'm using fedora core 4 with gcc 4
and this doesn;t compile out of the box.
(line 840 of simpleini.h ; before i expected.)
anyone else have issues ?
 
/nc

AnswerRe: linux working ? [modified]memberbrofield22 May '06 - 17:46 
I have fixed the compile error with gcc 4 by adding in "typename" keywords where appropriate. The download here is updated, and the latest version can always be found at http://code.jellycan.com/simpleini/
 
Regards,
Brodie
GeneralRe: linux working ? [modified]memberneilcostigan22 May '06 - 22:23 
that did the trick.
thanks.
 
/nc

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

Permalink | Advertise | Privacy | Mobile
Web04 | 2.6.130516.1 | Last Updated 27 Feb 2012
Article Copyright 2006 by brofield
Everything else Copyright © CodeProject, 1999-2013
Terms of Use
Layout: fixed | fluid