dirk/C++/glibmm/get-env


Weingarten, 10-02-22

get-env – Application Directories and Environment

I often have the same problem again and again: The application shall load an ini file, locate the help files, call supplementary external programs etc. etc. However, it is always the same issue – where is the application directory. This is not as trivial as it sounds for some reasons:

And last but not least, requirement for portability doesn't simplify things.

The glib/glibmm seems to be prepared for such questions. Thus, a sample application was necessary to clarify opportunities.

Source Code

Text Fileget-env.cc
/** @file sample about directories and environment of an application
 *
 * Last CVS checkin:
 * $Date: $
 * $Author: scheff $
 */

/**************************************************************************/

// standard C/C++ header:
#include <iomanip>
#include <iostream>
#include <string>

// Gnome header:
#include <glibmm/init.h>
#include <glibmm/miscutils.h>

using namespace std;

/**************************************************************************/

/** waits for user confirm.
 *
 * @param action text with next action
 */
static void pause(const char *action)
{
  cout << "Press [ENTER] to " << action << ": " << flush;
  string str; getline(cin, str);
}

/** provides the main function of application.
 *
 * @param argc number of command line arguments
 * @param argv pointer to array of pointers to strings with command line
 *        arguments
 * @return 0 ... application exited regularly\n
 *         else ... execution of application aborted
 */
int main(int argc, char *argv[], char *env[])
{
  Glib::init();
  pause("start");
  cout << "argv[0]: '" << argv[0] << '\'' << endl;
  cout << "get_application_name(): '"
    << Glib::get_application_name() << '\'' << endl;
  cout << "get_prgname(): '"
    << Glib::get_prgname() << '\'' << endl;
  cout << "get_user_name(): '"
    << Glib::get_user_name() << '\'' << endl;
  cout << "get_real_name(): '"
    << Glib::get_real_name() << '\'' << endl;
  cout << "get_home_dir(): '"
    << Glib::get_home_dir() << '\'' << endl;
  cout << "get_tmp_dir(): '"
    << Glib::get_tmp_dir() << '\'' << endl;
  cout << "get_current_dir(): '"
    << Glib::get_current_dir() << '\'' << endl;
  cout << "get_user_data_dir(): '"
    << Glib::get_user_data_dir() << '\'' << endl;
  cout << "get_user_config_dir(): '"
    << Glib::get_user_config_dir() << '\'' << endl;
  cout << "get_user_cache_dir(): '"
    << Glib::get_user_cache_dir() << '\'' << endl;
  cout << "---" << endl;
#ifdef WIN32
  { gchar *dir = g_win32_get_package_installation_directory_of_module(0);
    cout << "g_win32_get_package_installation_directory_of_module(): '"
      << dir << '\'' << endl;
    g_free(dir);
  }
#endif // WIN32
  pause("continue");
  { gchar **envList = g_listenv(); int i;
    for (i = 0; envList[i]; ++i) {
      gchar *env = envList[i];
      cout << setw(2) << i << ": " << env
        << " = " << Glib::getenv(env) << endl;
    }
    g_strfreev(envList);
  }
  // done
  pause("finish");
  return 0;
}

Output

Console:
                                                                                
Press [ENTER] to start: ↵
argv[0]: 'c:\Dokumente und Einstellungen\scheff\Eigene Dateien\tests\glibmm\Debug\get-env.exe'
get_application_name(): 'get-env.exe'
get_prgname(): 'get-env.exe'
get_user_name(): 'scheff'
get_real_name(): 'scheff'
get_home_dir(): 'c:\Dokumente und Einstellungen\scheff\Eigene Dateien'
get_tmp_dir(): 'c:\DOKUME~1\scheff\LOKALE~1\Temp'
get_current_dir(): 'c:\Dokumente und Einstellungen\scheff\Eigene Dateien'
get_user_data_dir(): 'C:\Dokumente und Einstellungen\scheff\Eigene Dateien'
get_user_config_dir(): 'C:\Dokumente und Einstellungen\scheff\Anwendungsdaten'
get_user_cache_dir(): 'C:\Dokumente und Einstellungen\scheff\Lokale Einstellungen\Temporary Internet Files'
---
g_win32_get_package_installation_directory_of_module(): 'c:\Dokumente und Einstellungen\scheff\Eigene Dateien\tests\glibmm\Debug'
Press [ENTER] to continue: ↵
 0: !EXITCODE = 000000B8
 1: ALLUSERSPROFILE = C:\Dokumente und Einstellungen\All Users
 2: APPDATA = C:\Dokumente und Einstellungen\scheff\Anwendungsdaten
 3: CLIENTNAME = Console
 4: COMMONPROGRAMFILES = C:\Programme\Gemeinsame Dateien
 5: COMPUTERNAME = TANJA
 6: COMSPEC = C:\WINDOWS\system32\cmd.exe
 7: CYGWIN_ROOT = \Programme\cygwin
 8: DISPLAY = 127.0.0.1:0.0
 9: GTKMM_BASEPATH = C:\Dev\GTK\2.0
10: HOME = c:\Dokumente und Einstellungen\scheff\Eigene Dateien
11: HOMEDRIVE = C:
12: HOMEPATH = \Dokumente und Einstellungen\scheff
13: HOSTNAME = Tanja
14: INFOPATH = /usr/local/info:/usr/share/info:/usr/info:/usr/local/info:/usr/share/info:/usr/info:
15: LANG = de
16: LOGNAME = scheff
17: LOGONSERVER = \\TANJA
18: MAKE_MODE = unix
19: MANPATH = /usr/local/man:/usr/share/man:/usr/man:/usr/local/man:/usr/share/man:/usr/man::/usr/ssl/man:/usr/X11R6/man:/usr/ssl/man:/usr/X11R6/man
20: NUMBER_OF_PROCESSORS = 2
21: OLDPWD = /cygdrive/c/Dokumente und Einstellungen/scheff/Eigene Dateien/tests
22: OS = Windows_NT
23: OSTYPE = cygwin
24: PATH = C:\Programme\cygwin\usr\local\bin;C:\Programme\cygwin\bin;C:\Programme\cygwin\bin;C:\Programme\cygwin\usr\X11R6\bin;C:\Programme\cygwin\usr\local\bin;C:\Programme\cygwin\bin;C:\Programme\cygwin\bin;C:\Programme\cygwin\usr\X11R6\bin;.;C:\Programme\cygwin\bin;C:\Programme\cygwin\usr\X11R6\bin;c:\Dev\GTK\2.0\bin;c:\WINDOWS\system32;c:\WINDOWS;c:\WINDOWS\System32\Wbem;c:\Dokumente und Einstellungen\scheff\Eigene Dateien\tools\Release;C:\Programme\cygwin\usr\X11R6\bin;C:\Programme\cygwin\usr\X11R6\bin;
25: PATHEXT = .COM;.EXE;.BAT;.CMD;.VBS;.VBE
26: PKG_CONFIG_PATH = C:\Dev\lib\pkgconfig
27: PRINTER = HP Color LaserJet 2600n
28: PROCESSOR_ARCHITECTURE = x86
29: PROCESSOR_IDENTIFIER = x86 Family 6 Model 14 Stepping 8, GenuineIntel
30: PROCESSOR_LEVEL = 6
31: PROCESSOR_REVISION = 0e08
32: PROGRAMFILES = C:\Programme
33: PROMPT = $P$G
34: PS1 = \[\e]0;\w\a\]\n\[\e[32m\]\u@\h \[\e[33m\]\w\[\e[0m\]\n\$ 
35: PWD = /cygdrive/c/Dokumente und Einstellungen/scheff/Eigene Dateien
36: RUN = \Programme\cygwin\bin\run -p /usr/X11R6/bin
37: SESSIONNAME = Console
38: SHLVL = 2
39: SYSTEMDRIVE = C:
40: SYSTEMROOT = C:\WINDOWS
41: TEMP = c:\DOKUME~1\scheff\LOKALE~1\Temp
42: TERM = xterm
43: TERMCAP = xterm-r6|xterm|xterm X11R6 version:am:km:mi:ms:xn:co#80:it#8:li#24:AL=\E[%dL:DC=\E[%dP:DL=\E[%dM:DO=\E[%dB:LE=\E[%dD:RI=\E[%dC:UP=\E[%dA:ae=^O:al=\E[L:as=^N:bl=^G:cd=\E[J:ce=\E[K:cl=\E[H\E[2J:cm=\E[%i%d;%dH:cr=^M:cs=\E[%i%d;%dr:ct=\E[3g:dc=\E[P:dl=\E[M:do=^J:ei=\E[4l:ho=\E[H:im=\E[4h:is=\E7\E[r\E[m\E[?7h\E[?1;3;4;6l\E[4l\E8\E>:k1=\EOP:k2=\EOQ:k3=\EOR:k4=\EOS:k5=\E[15~:k6=\E[17~:k7=\E[18~:k8=\E[19~:k9=\E[20~:kD=\E[3~:kI=\E[2~:kN=\E[6~:kP=\E[5~:kd=\EOB:ke=\E[?1l\E>:kh=\E[1~:kl=\EOD:kr=\EOC:ks=\E[?1h\E=:ku=\EOA:le=^H:md=\E[1m:me=\E[m:mr=\E[7m:nd=\E[C:rc=\E8:sc=\E7:se=\E[m:sf=^J:so=\E[7m:sr=\EM:ta=^I:te=\E[2J\E[?47l\E8:ti=\E7\E[?47h:ue=\E[m:up=\E[A:us=\E[4m:kb=\010:
44: TMP = c:\DOKUME~1\scheff\LOKALE~1\Temp
45: USER = scheff
46: USERDOMAIN = TANJA
47: USERNAME = scheff
48: USERPROFILE = C:\Dokumente und Einstellungen\scheff
49: VS90COMNTOOLS = C:\Programme\Microsoft Visual Studio 9.0\Common7\Tools\
50: WINDIR = C:\WINDOWS
51: WINDOWID = 10485774
52: WINHOME = /cygdrive/c/Dokumente und Einstellungen/scheff/Eigene Dateien
53: XAPPLRESDIR = /usr/X11R6/lib/X11/app-defaults
54: XCMSDB = /usr/X11R6/lib/X11/Xcms.txt
55: XKEYSYMDB = /usr/X11R6/lib/X11/XKeysymDB
56: XNLSPATH = /usr/X11R6/lib/X11/locale
57: XTERM_SHELL = /usr/bin/bash
58: XTERM_VERSION = Cygwin 6.8.2.0(202)
59: _ = tests/glibmm/Debug/get-env.exe
Press [ENTER] to finish: ↵

Files

Text Fileget-env.ccC++ source code
MS Visual C++ 2008 Project Fileget-env.vcprojMS Visual C++ 2008 project file

dirk/C++/glibmm/get-env


Last modified: Sun Feb 28 13:47:21 2010