source: trunk/src/global/wtl_app.cpp @ 552

Revision 552, 3.8 KB checked in by Eoin, 12 years ago (diff)
Line 
1
2//         Copyright Eóin O'Callaghan 2006 - 2007.
3// Distributed under the Boost Software License, Version 1.0.
4//    (See accompanying file LICENSE_1_0.txt or copy at
5//          http://www.boost.org/LICENSE_1_0.txt)
6
7#include "stdAfx.hpp"
8
9#include <boost/array.hpp>
10
11#define WINVER 0x0500
12#define _WIN32_WINNT 0x0500
13#define _WIN32_IE 0x0500
14#define _RICHEDIT_VER 0x0200
15#define VC_EXTRALEAN
16
17#ifdef WIN32_LEAN_AND_MEAN
18#undef WIN32_LEAN_AND_MEAN
19#endif
20
21#include <atlbase.h>
22#include <atlapp.h>
23
24extern WTL::CAppModule _Module;
25
26#include "wtl_app.hpp"
27#include "string_conv.hpp"
28
29#include <boost/filesystem/operations.hpp>
30#include <boost/filesystem/fstream.hpp>
31
32#define BOOST_UTF8_BEGIN_NAMESPACE \
33    namespace boost { namespace filesystem { namespace detail {
34
35#define BOOST_UTF8_END_NAMESPACE }}}
36#define BOOST_UTF8_DECL BOOST_FILESYSTEM_DECL
37
38#include <boost/detail/utf8_codecvt_facet.hpp>
39
40namespace hal
41{
42
43class app_impl
44{
45public:
46        app_impl() :
47                hmod_(NULL),
48                instance_(_Module.GetModuleInstance()),
49                initial_path_(boost::filesystem::initial_path<boost::filesystem::wpath>())
50        {
51                LPWSTR *szArglist; int nArgs;           
52                szArglist = CommandLineToArgvW(GetCommandLineW(), &nArgs);
53               
54                std::locale global_loc = std::locale();
55                std::locale loc(global_loc, new boost::filesystem::detail::utf8_codecvt_facet);
56                boost::filesystem::wpath_traits::imbue(loc);
57               
58                if (NULL == szArglist)
59                {
60                }
61                else
62                {
63                        exe_string_  = szArglist[0];
64                        exe_path_ = boost::filesystem::wpath(exe_string_);
65                       
66                        for (int i=1; i<nArgs; ++i) 
67                                command_args_.push_back(szArglist[i]);
68                               
69                        working_directory_ = exe_path_.parent_path();
70                }               
71                LocalFree(szArglist);   
72        }
73
74        friend class app_module;
75
76private:
77        HMODULE hmod_;
78        HINSTANCE instance_;
79        std::wstring exe_string_;
80        std::wstring res_dll_;
81       
82        boost::filesystem::wpath exe_path_;
83        boost::filesystem::wpath initial_path_;
84        boost::filesystem::wpath working_directory_;
85       
86        std::vector<std::wstring> command_args_;       
87};
88
89app_module::app_module() :
90        pimpl(new app_impl())
91{}
92
93const std::wstring& app_module::exe_string() const 
94{ 
95        return pimpl->exe_string_; 
96}
97
98const boost::filesystem::wpath& app_module::exe_path() const 
99{ 
100        return pimpl->exe_path_; 
101}
102
103const boost::filesystem::wpath& app_module::initial_path() const 
104{ 
105        return pimpl->initial_path_; 
106}
107
108const boost::filesystem::wpath& app_module::working_directory() const 
109{ 
110        return pimpl->working_directory_; 
111}
112       
113const std::vector<std::wstring>& app_module::command_args() const 
114{ 
115        return pimpl->command_args_; 
116}
117       
118void app_module::res_revert()
119{
120        if (pimpl->hmod_) FreeLibrary(pimpl->hmod_);
121        _Module.SetResourceInstance(pimpl->instance_);
122}
123
124void app_module::res_set_dll(std::wstring dll)
125{
126        if (pimpl->hmod_) FreeLibrary(pimpl->hmod_);
127        pimpl->res_dll_ = dll;
128       
129        HMODULE hmod_ = ::LoadLibraryEx(dll.c_str(), 0, LOAD_LIBRARY_AS_DATAFILE);
130        _Module.SetResourceInstance(reinterpret_cast<HINSTANCE>(hmod_));
131}
132
133std::wstring app_module::res_wstr(unsigned uID)
134{
135        // The upper size limit ain't nice, but at least it's safe from buffer overflow
136        win_c_str<std::wstring> str(2048);
137       
138        int size = ::LoadString(_Module.GetResourceInstance(), uID, str, str.size());
139        assert(size != 0);
140       
141        return str;
142}
143
144std::pair<void*,size_t> app_module::res_find_lock(unsigned name, unsigned type)
145{
146        HRSRC rsrc = FindResource(_Module.GetResourceInstance(), (LPCTSTR)name, (LPCTSTR)type);
147        assert(rsrc);
148       
149        HGLOBAL global = LoadResource(_Module.GetResourceInstance(), rsrc);
150        assert(global);
151       
152        void* ptr = LockResource(global);
153        assert(ptr);
154       
155        return std::pair<void*,size_t>(ptr, SizeofResource(_Module.GetResourceInstance(), rsrc));
156}
157
158app_module& app()
159{
160        static app_module app;
161        return app;
162}
163
164} // namespace hal
Note: See TracBrowser for help on using the repository browser.