home *** CD-ROM | disk | FTP | other *** search
/ Tricks of the Windows Gam…ming Gurus (2nd Edition) / Disc2.iso / msdn_vcb / samples / vc98 / sdk / com / oleaut / spoly2 / misc.cpp < prev    next >
C/C++ Source or Header  |  1997-08-01  |  5KB  |  253 lines

  1. /*** 
  2. *misc.cpp
  3. *
  4. *  This is a part of the Microsoft Source Code Samples.
  5. *
  6. *  Copyright (C) 1992-1997 Microsoft Corporation. All rights reserved.
  7. *
  8. *  This source code is only intended as a supplement to Microsoft Development
  9. *  Tools and/or WinHelp documentation.  See these sources for detailed
  10. *  information regarding the Microsoft samples programs.
  11. *
  12. *Purpose:
  13. *
  14. *Implementation Notes:
  15. *
  16. *****************************************************************************/
  17.  
  18.  
  19. #include "spoly.h"
  20. #include "cpoint.h"
  21. #include "cpoly.h"
  22.  
  23. #include <stdio.h>
  24.  
  25. #ifdef _MAC
  26. # include <string.h>
  27. # include <ctype.h>
  28. #endif
  29.  
  30. unsigned long g_dwPolyCF = 0;
  31. unsigned long g_dwPointCF = 0;
  32.  
  33. IClassFactory FAR* g_ppolyCF = NULL;
  34. IClassFactory FAR* g_ppointCF = NULL;
  35.  
  36. unsigned int g_fObjectsRevoked = 0;
  37. unsigned int g_cObjects = 0;
  38. unsigned int g_fQuit = 0;
  39.  
  40. #ifdef _MAC
  41. struct regentry{
  42.     char *szKey;
  43.     char *szValue;
  44. } g_rgregentry[] = {
  45.  
  46.       { "CLSID\\{00020464-0000-0000-C000-000000000046}",
  47.     "OLE Automation SPoly2 1.0 Application" }
  48.  
  49.     , { "CLSID\\{00020464-0000-0000-C000-000000000046}\\LocalServer",
  50.         "SPL2" }
  51.  
  52.     , { "CLSID\\{00020464-0000-0000-C000-000000000046}\\ProgID",
  53.     "SPoly2.Application" }
  54.  
  55.     , { "CLSID\\{00020464-0000-0000-C000-000000000046}\\InprocHandler",
  56.     "OLE2:Def$DefFSet" }
  57.  
  58.     , { "SPL2", "{00020464-0000-0000-C000-000000000046}" }
  59.  
  60.     , { "SPoly2.Application\\CLSID",
  61.     "{00020464-0000-0000-C000-000000000046}" }
  62.  
  63. };
  64.  
  65. HRESULT
  66. EnsureRegistration()
  67. {
  68.     HKEY hkey;
  69.  
  70.     if(RegOpenKey(HKEY_CLASSES_ROOT, "SPL2", &hkey) == NOERROR){
  71.       RegCloseKey(hkey);
  72.       return NOERROR;
  73.     }
  74.  
  75.     for(int i = 0; i < DIM(g_rgregentry); ++i){
  76.       if(RegSetValue(HKEY_CLASSES_ROOT, g_rgregentry[i].szKey, REG_SZ, g_rgregentry[i].szValue, 0) != ERROR_SUCCESS)
  77.         return E_FAIL;
  78.     }
  79.  
  80.     return NOERROR;
  81. }
  82. #endif
  83.  
  84. /***
  85. *HRESULT InitOle(void)
  86. *Purpose:
  87. *  Initialize Ole, and register our class factories.
  88. *
  89. *Entry:
  90. *  None
  91. *
  92. *Exit:
  93. *  None
  94. *
  95. ***********************************************************************/
  96. STDAPI
  97. InitOle()
  98. {
  99.     HRESULT hresult;
  100.  
  101.     if((hresult = OleInitialize(NULL)) != NOERROR)
  102.       goto LError0;
  103.  
  104. #ifdef _MAC
  105.     if((hresult = EnsureRegistration()) != NOERROR)
  106.       goto LError0;
  107. #endif
  108.  
  109.     // Register the CPoint Class Factory
  110.     //
  111.     if((g_ppointCF = CPointCF::Create()) == NULL){
  112.       hresult = E_OUTOFMEMORY;
  113.       goto LError1;
  114.     }
  115.  
  116.     hresult = CoRegisterClassObject(
  117.       CLSID_CPoint2,
  118.       g_ppointCF,
  119.       CLSCTX_LOCAL_SERVER,
  120.       REGCLS_MULTIPLEUSE,
  121.       &g_dwPointCF);
  122.     if(FAILED(hresult))
  123.       goto LError1;
  124.  
  125.     // Register the CPoly Class Factory.
  126.     //
  127.     if((g_ppolyCF = CPolyCF::Create()) == NULL){
  128.       hresult = E_OUTOFMEMORY;
  129.       goto LError1;
  130.     }
  131.  
  132.     hresult = CoRegisterClassObject(
  133.       CLSID_CPoly2,
  134.       g_ppolyCF,
  135.       CLSCTX_LOCAL_SERVER,
  136.       REGCLS_MULTIPLEUSE,
  137.       &g_dwPolyCF);
  138.     if(FAILED(hresult))
  139.       goto LError1;
  140.  
  141.     g_ppolyCF->Release();
  142.  
  143.     g_ppointCF->Release();
  144.  
  145.     return NOERROR;
  146.  
  147.  
  148. LError1:;
  149.     if(g_ppolyCF != NULL)
  150.       g_ppolyCF->Release();
  151.  
  152.     if(g_ppointCF != NULL)
  153.       g_ppointCF->Release();
  154.  
  155.     UninitOle();
  156.  
  157. LError0:;
  158.     return hresult;
  159. }
  160.  
  161. STDAPI
  162. Revoke()
  163. {
  164.     if (!g_fObjectsRevoked) {
  165.       // Tell Ole to release our class factories.
  166.       //
  167.       if(g_dwPointCF != 0L)
  168.         CoRevokeClassObject(g_dwPointCF);
  169.  
  170.       if(g_dwPolyCF != 0L)
  171.         CoRevokeClassObject(g_dwPolyCF);
  172.  
  173.       g_fObjectsRevoked = 1;
  174.    }
  175.  
  176.    return NOERROR;
  177. }
  178.  
  179. STDAPI
  180. UninitOle()
  181. {
  182.     Revoke();
  183.     OleUninitialize();
  184.  
  185.     return NOERROR;
  186. }
  187.  
  188. // disable unicode expansion for assertions
  189. #undef UNICODE
  190.  
  191. void
  192. Assert(int fCond, char FAR* file, int line, char FAR* message)
  193. {
  194.     char * fmt;
  195.     char buf[128];
  196.  
  197.     if(fCond)
  198.       return;
  199.  
  200.     fmt = (message == NULL)
  201.       ? "Assertion failed: %s(%d)"
  202.       : "Assertion failed: %s(%d) '%s'";
  203.     sprintf(buf, fmt, file, line, message);
  204.  
  205. #ifdef _MAC
  206.     DebugStr(c2pstr(buf));
  207. #else
  208. #ifdef WIN32
  209.     OutputDebugStringA(buf);
  210. #else //WIN32
  211.     OutputDebugString(buf);
  212. #endif //WIN32
  213.     DebugBreak();
  214. #endif
  215. }
  216.  
  217. void IncObjectCount()
  218. {
  219.     g_cObjects++;
  220. }
  221.  
  222. void DecObjectCount()
  223. {
  224.     g_cObjects--;
  225.  
  226.     if (!g_cObjects && g_fQuit) {
  227.       Revoke();
  228. #ifndef _MAC
  229.       PostQuitMessage(0);
  230. #endif // !_MAC
  231.     }
  232. }
  233.  
  234. #ifdef _MAC
  235. #if defined(_MSC_VER)
  236. int pascal
  237. #else
  238. pascal int
  239. #endif
  240. stricmp(char *first, char *last)
  241. {
  242.     unsigned short f, l;
  243.  
  244.     do{
  245.     f = tolower(*first++);
  246.     l = tolower(*last++);
  247.     }while(f && f == l);
  248.  
  249.     return f - l;
  250. }
  251. #endif
  252.  
  253.