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:
- Application file name might have been renamed (e.g. got a date prefix).
- Application directory has been added to $PATH.
- Application file has been linked from a directory in $PATH.
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
get-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
dirk/C++/glibmm/get-env
Last modified: Sun Feb 28 13:47:21 2010