MSRGuard.h 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341
  1. #pragma once
  2. /////////////////////////////////////////////////////////////////////////////
  3. // MSRGuard.h : Defines the module-wide state
  4. //
  5. /////////////////////////////////////////////////////////////////////////////
  6. // Forward Declaration
  7. class IAppMode;
  8. /////////////////////////////////////////////////////////////////////////////
  9. // CMSRGuardModule
  10. //
  11. class CMSRGuardModule : public Win32App
  12. {
  13. // Construction
  14. public:
  15. CMSRGuardModule();
  16. void Init();
  17. // Attributes
  18. public:
  19. // Option flags
  20. bool GetOptionValue(const ZString& strOptionFlag, ZString& strOut) const;
  21. bool GetOptionExists(const ZString& strOptionFlag) const;
  22. ZString GetOptionString(const ZString& strOptionFlag) const;
  23. ZString GetOptionString(const ZString& strOptionFlag, const ZString& strDefault) const;
  24. long GetOptionLong(const ZString& strOptionFlag) const;
  25. long GetOptionLong(const ZString& strOptionFlag, long nDefault) const;
  26. bool GetOptionBool(const ZString& strOptionFlag) const;
  27. bool GetOptionBool(const ZString& strOptionFlag, bool bDefault) const;
  28. bool GetConfigValue(const ZString& strConfigName, ZString& strOut) const;
  29. // Config settings
  30. bool GetConfigExists(const ZString& strConfigName) const;
  31. ZString GetConfigString(const ZString& strConfigName) const;
  32. ZString GetConfigString(const ZString& strConfigName, const ZString& strDefault) const;
  33. long GetConfigLong(const ZString& strConfigName) const;
  34. long GetConfigLong(const ZString& strConfigName, long nDefault) const;
  35. bool GetConfigBool(const ZString& strConfigName) const;
  36. bool GetConfigBool(const ZString& strConfigName, bool bDefault) const;
  37. // Other
  38. HINSTANCE GetResourceInstance() const;
  39. HINSTANCE GetModuleInstance() const;
  40. LPCTSTR GetTitle() const;
  41. int GetCountOfOptionsEaten() const;
  42. // Debugging control
  43. bool GetHitFirstBreakpoint() const;
  44. void SetHitFirstBreakpoint(bool bHit);
  45. // Operations
  46. public:
  47. int DoMain(int argc, TCHAR* argv[]);
  48. HRESULT HandleErrorV(HRESULT hr, UINT idFmt, va_list argptr);
  49. HRESULT HandleError(HRESULT hr, UINT idFmt, ...);
  50. HRESULT DisplayMessageV(UINT idFmt, va_list argptr);
  51. HRESULT DisplayMessage(UINT idFmt, ...);
  52. ZString GetErrorString(HRESULT hr);
  53. // Resource helpers
  54. HRESULT LoadString(ZString& strOut, UINT idRes);
  55. HRESULT FormatStringV(ZString& strOut, UINT idFmt, va_list argptr);
  56. HRESULT FormatString(ZString& strOut, UINT idFmt, ...);
  57. HRESULT FormatStringV(ZString& strOut, LPCTSTR pszFmt, va_list argptr);
  58. HRESULT FormatString(ZString& strOut, LPCTSTR pszFmt, ...);
  59. HRESULT LoadMINI(ZString& strOut);
  60. HRESULT LoadHTML(ZString& strOut);
  61. // Registry helpers
  62. static HKEY HKEYFromString(const ZString& strHKEY);
  63. // Implementation
  64. private:
  65. int ProcessCmdLineOption(int i, int argc, TCHAR* argv[]);
  66. void SetAppMode(IAppMode* pAppMode);
  67. HRESULT LoadConfig();
  68. // Option Flag Handlers
  69. private:
  70. int OnOptionHelp (int i, int argc, TCHAR* argv[]);
  71. int OnOptionPID (int i, int argc, TCHAR* argv[]);
  72. int OnOptionINI (int i, int argc, TCHAR* argv[]);
  73. int OnOptionMINI (int i, int argc, TCHAR* argv[]);
  74. int OnOptionHTML (int i, int argc, TCHAR* argv[]);
  75. int OnOptionBind (int i, int argc, TCHAR* argv[]);
  76. int OnOptionSilent(int i, int argc, TCHAR* argv[]);
  77. // Types
  78. private:
  79. typedef int (CMSRGuardModule::*XOptionFlagProc)(int, int, TCHAR*[]);
  80. struct XOptionFlag
  81. {
  82. LPCTSTR m_szOptionFlag;
  83. int m_cchSignificant;
  84. XOptionFlagProc m_pfn;
  85. };
  86. typedef const XOptionFlag* XOptionFlagIt;
  87. struct XLessCI : public std::binary_function<ZString, ZString, bool>
  88. {
  89. bool operator()(const ZString& x, const ZString& y) const
  90. {
  91. return 0 > _stricmp(x, y);
  92. }
  93. };
  94. typedef std::map<ZString, ZString, XLessCI> XOptionMap;
  95. typedef XOptionMap::const_iterator XOptionMapIt;
  96. typedef std::map<ZString, ZString, XLessCI> XConfigMap;
  97. typedef XConfigMap::const_iterator XConfigMapIt;
  98. // Data Members
  99. private:
  100. XOptionMap m_Options;
  101. XConfigMap m_Configs;
  102. HINSTANCE m_hinst;
  103. HINSTANCE m_hinstResource;
  104. int m_cOptionsEaten;
  105. IAppMode* m_pAppMode;
  106. bool m_bHitFirstBreakpoint;
  107. // Static Data
  108. private:
  109. const static XOptionFlag s_OptionFlags[];
  110. };
  111. /////////////////////////////////////////////////////////////////////////////
  112. // Global Instance
  113. //
  114. extern CMSRGuardModule g;
  115. /////////////////////////////////////////////////////////////////////////////
  116. // Attributes
  117. /////////////////////////////////////////////////////////////////////////////
  118. //
  119. inline bool CMSRGuardModule::GetOptionValue(const ZString& strOptionFlag,
  120. ZString& strOut) const
  121. {
  122. XOptionMapIt it = m_Options.find(strOptionFlag);
  123. if (m_Options.end() == it)
  124. return false;
  125. strOut = it->second;
  126. return true;
  127. }
  128. /////////////////////////////////////////////////////////////////////////////
  129. //
  130. inline bool CMSRGuardModule::GetOptionExists(const ZString& strOptionFlag)
  131. const
  132. {
  133. return m_Options.end() != m_Options.find(strOptionFlag);
  134. }
  135. /////////////////////////////////////////////////////////////////////////////
  136. //
  137. inline ZString CMSRGuardModule::GetOptionString(
  138. const ZString& strOptionFlag) const
  139. {
  140. return GetOptionString(strOptionFlag, ZString());
  141. }
  142. /////////////////////////////////////////////////////////////////////////////
  143. //
  144. inline ZString CMSRGuardModule::GetOptionString(const ZString& strOptionFlag,
  145. const ZString& strDefault) const
  146. {
  147. ZString str(strDefault);
  148. GetOptionValue(strOptionFlag, str);
  149. return str;
  150. }
  151. /////////////////////////////////////////////////////////////////////////////
  152. //
  153. inline long CMSRGuardModule::GetOptionLong(
  154. const ZString& strOptionFlag) const
  155. {
  156. return GetOptionLong(strOptionFlag, 0L);
  157. }
  158. /////////////////////////////////////////////////////////////////////////////
  159. //
  160. inline long CMSRGuardModule::GetOptionLong(const ZString& strOptionFlag,
  161. long nDefault) const
  162. {
  163. ZString str;
  164. return GetOptionValue(strOptionFlag, str) ? _ttol(str) : nDefault;
  165. }
  166. /////////////////////////////////////////////////////////////////////////////
  167. //
  168. inline bool CMSRGuardModule::GetOptionBool(
  169. const ZString& strOptionFlag) const
  170. {
  171. return GetOptionBool(strOptionFlag, false);
  172. }
  173. /////////////////////////////////////////////////////////////////////////////
  174. //
  175. inline bool CMSRGuardModule::GetOptionBool(const ZString& strOptionFlag,
  176. bool bDefault) const
  177. {
  178. return !!GetOptionLong(strOptionFlag, static_cast<long>(bDefault));
  179. }
  180. /////////////////////////////////////////////////////////////////////////////
  181. //
  182. inline bool CMSRGuardModule::GetConfigValue(const ZString& strConfigName,
  183. ZString& strOut) const
  184. {
  185. XConfigMapIt it = m_Configs.find(strConfigName);
  186. if (m_Configs.end() == it)
  187. return false;
  188. strOut = it->second;
  189. return true;
  190. }
  191. /////////////////////////////////////////////////////////////////////////////
  192. //
  193. inline bool CMSRGuardModule::GetConfigExists(const ZString& strConfigName)
  194. const
  195. {
  196. return m_Configs.end() != m_Configs.find(strConfigName);
  197. }
  198. /////////////////////////////////////////////////////////////////////////////
  199. //
  200. inline ZString CMSRGuardModule::GetConfigString(
  201. const ZString& strConfigName) const
  202. {
  203. return GetConfigString(strConfigName, ZString());
  204. }
  205. /////////////////////////////////////////////////////////////////////////////
  206. //
  207. inline ZString CMSRGuardModule::GetConfigString(const ZString& strConfigName,
  208. const ZString& strDefault) const
  209. {
  210. ZString str(strDefault);
  211. GetConfigValue(strConfigName, str);
  212. return str;
  213. }
  214. /////////////////////////////////////////////////////////////////////////////
  215. //
  216. inline long CMSRGuardModule::GetConfigLong(
  217. const ZString& strConfigName) const
  218. {
  219. return GetConfigLong(strConfigName, 0L);
  220. }
  221. /////////////////////////////////////////////////////////////////////////////
  222. //
  223. inline long CMSRGuardModule::GetConfigLong(const ZString& strConfigName,
  224. long nDefault) const
  225. {
  226. ZString str;
  227. return GetConfigValue(strConfigName, str) ? _ttol(str) : nDefault;
  228. }
  229. /////////////////////////////////////////////////////////////////////////////
  230. //
  231. inline bool CMSRGuardModule::GetConfigBool(
  232. const ZString& strConfigName) const
  233. {
  234. return GetConfigBool(strConfigName, false);
  235. }
  236. /////////////////////////////////////////////////////////////////////////////
  237. //
  238. inline bool CMSRGuardModule::GetConfigBool(const ZString& strConfigName,
  239. bool bDefault) const
  240. {
  241. return !!GetConfigLong(strConfigName, static_cast<long>(bDefault));
  242. }
  243. /////////////////////////////////////////////////////////////////////////////
  244. //
  245. inline HINSTANCE CMSRGuardModule::GetResourceInstance() const
  246. {
  247. return m_hinstResource;
  248. }
  249. /////////////////////////////////////////////////////////////////////////////
  250. //
  251. inline HINSTANCE CMSRGuardModule::GetModuleInstance() const
  252. {
  253. return m_hinst;
  254. }
  255. /////////////////////////////////////////////////////////////////////////////
  256. //
  257. inline LPCTSTR CMSRGuardModule::GetTitle() const
  258. {
  259. return GetConfigString(TEXT("Title"));
  260. }
  261. /////////////////////////////////////////////////////////////////////////////
  262. //
  263. inline int CMSRGuardModule::GetCountOfOptionsEaten() const
  264. {
  265. return m_cOptionsEaten;
  266. }
  267. /////////////////////////////////////////////////////////////////////////////
  268. //
  269. inline bool CMSRGuardModule::GetHitFirstBreakpoint() const
  270. {
  271. return m_bHitFirstBreakpoint;
  272. }
  273. /////////////////////////////////////////////////////////////////////////////
  274. //
  275. inline void CMSRGuardModule::SetHitFirstBreakpoint(bool bHit)
  276. {
  277. m_bHitFirstBreakpoint = bHit;
  278. }