On Saturday 13 September 2014 14:24:35 Fernando Rodriguez wrote:
> On Saturday 13 September 2014 4:21:18 PM Geert Janssens wrote:
> > Thanks a lot !
> >
> > I'll try to apply a similar approach in gnucash for the
> > home dir use case.
> >
> > For my second case, anybody know how to read an
> > environment variable directly in win32 using wide char
> > functions ?
> >
> >
> > Geert
> > _______________________________________________
> > gtk-app-devel-list mailing list
> > [email protected]
> > https://mail.gnome.org/mailman/listinfo/gtk-app-devel-list
>
> You'd use the GetEnvironmentVariable function. What compiler and IDE
> are you using?
>
I'm using mingw32, gcc 4.8.1.
> In Windows every API function that deals with text has two variants,
> so theres GetEnvironmentVariableA and GetEnvironmentVariableW.
>
> If you use Visual Studio there's an option on project properties to
> select the encoding and it #defines a symbol that defines the macros
> to call either variant and you would use the TCHAR (there's a bunch
> of typedefs for dealing with strings for example LPTSTR, LPSTR,
> LPWSTR but they all boil down to the same thing, in this case LPSTR
> is typedef for char*, LPWSTR wchar_t*, and LPTSTR is char* for ansi
> and wchar_t* for unicode) type to store the strings (it's a typedef
> for char when using ANSI and wchar_t when using unicode). I'm not
> sure what the symbol is called so if you're not using VS you can just
> use the wide char variants directly or look at the headers and find
> out what you need to define.
>
Thanks for the additional detail (for some reason my previous mail got
truncated by the list
software.
I have now written this function:
#ifdef G_OS_WIN32
#define BUFSIZE 4096
static gchar* get_env_utf8 (const gchar* var_name)
{
LPWSTR val_win;
gchar *val_utf8;
guint32 retval;
ENTER();
val_win = (LPWSTR) malloc (BUFSIZE*sizeof(WCHAR));
if (!val_win)
return NULL; /* Out of memory... */
retval = GetEnvironmentVariableW (g_utf8_to_utf16 (var_name, -1, NULL,
NULL, NULL),
val_win, BUFSIZE);
if (0 == retval)
return NULL; /* Variable not set */
if (BUFSIZE < retval)
{
PWARN("Value of environment variable GNC_DOT_DIR is longer than %d. "
"The code can't handle this, so returning NULL instead.",
BUFSIZE);
return NULL; /* Woa, path is way to long... */
}
if ((val_utf8 = g_utf16_to_utf8 ((gunichar2*) val_win, -1, NULL, NULL,
NULL)) != NULL)
return val_utf8;
else
return NULL;
}
#endif
But in the end val_utf8 still doesn't keep the special characters.
If the environment variable GNC_DOT_DIR is set to "c:\gcdev\Ćukasz", val_win is
printed in
gdb as L"c:\\gcdev\\Lukasz" and
val_utf8 as "c:\\gcdev\\Lukasz"
If I examine the individual characters using
print val_win[9] and print val_win[10] those result in
L'L' and L'u'. To me that looks as if there are no wide characters in the
original string. :(
This is really puzzling me. What am I missing ?
Geert
_______________________________________________
gtk-app-devel-list mailing list
[email protected]
https://mail.gnome.org/mailman/listinfo/gtk-app-devel-list