MISC.CPP
上传用户:bangxh
上传日期:2007-01-31
资源大小:42235k
文件大小:7k
源码类别:

Windows编程

开发平台:

Visual C++

  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. #include "spoly.h"
  18. #include "cpoint.h"
  19. #include "cpoly.h"
  20. #include <stdio.h>
  21. #ifdef _MAC
  22. # include <string.h>
  23. # include <ctype.h>
  24. #endif
  25.       
  26. #ifdef WIN32  // Use native CompareString operation
  27.   #undef CompareString
  28.   #ifdef UNICODE
  29.     #define CompareString CompareStringW
  30.   #else
  31.     // CONSIDER: write a wrapper for CompareStringW if not available
  32.   #endif
  33. #else   
  34.   #define CompareString CompareStringA
  35. #endif   
  36. unsigned long g_dwPolyCF = 0;
  37. unsigned long g_dwPointCF = 0;
  38. IClassFactory FAR* g_ppolyCF = NULL;
  39. IClassFactory FAR* g_ppointCF = NULL;
  40. unsigned int g_fObjectsRevoked = 0;
  41. unsigned long g_cObjects = 0;
  42. unsigned int g_fQuit = 0;
  43. #ifdef _MAC
  44. struct regentry{
  45.     char *szKey;
  46.     char *szValue;
  47. } g_rgregentry[] = {
  48.       { "CLSID\{00020462-0000-0000-C000-000000000046}",
  49. "OLE Automation SPoly 1.0 Application" }
  50.     , { "CLSID\{00020462-0000-0000-C000-000000000046}\LocalServer",
  51. "SPLy" }
  52.     , { "CLSID\{00020462-0000-0000-C000-000000000046}\ProgID",
  53. "SPoly.Application" }
  54.     , { "CLSID\{00020462-0000-0000-C000-000000000046}\InprocHandler",
  55. "OLE2:Def$DefFSet" }
  56.     , { "SPLy", "{00020462-0000-0000-C000-000000000046}" }
  57.     , { "SPoly.Application\CLSID",
  58. "{00020462-0000-0000-C000-000000000046}" }
  59. };
  60. HRESULT
  61. EnsureRegistration()
  62. {
  63.     HKEY hkey;
  64.     if(RegOpenKey(HKEY_CLASSES_ROOT, "SPLy", &hkey) == NOERROR){
  65.       RegCloseKey(hkey);
  66.       return NOERROR;
  67.     }
  68.     for(int i = 0; i < DIM(g_rgregentry); ++i){
  69.       if(RegSetValue(HKEY_CLASSES_ROOT, g_rgregentry[i].szKey, REG_SZ, g_rgregentry[i].szValue, 0) != ERROR_SUCCESS)
  70.         return E_FAIL;
  71.     }
  72.     return NOERROR;
  73. }
  74. #endif
  75. /***
  76. *HRESULT InitOle(void)
  77. *Purpose:
  78. *  Initialize Ole, and register our class factories.
  79. *
  80. *Entry:
  81. *  None
  82. *
  83. *Exit:
  84. *  None
  85. *
  86. ***********************************************************************/
  87. STDAPI
  88. InitOle()
  89. {
  90.     HRESULT hresult;
  91.     if((hresult = OleInitialize(NULL)) != NOERROR)
  92.       goto LError0;
  93. #ifdef _MAC
  94.     if((hresult = EnsureRegistration()) != NOERROR)
  95.       goto LError0;
  96. #endif
  97.     // Register the CPoint Class Factory
  98.     //
  99.     if((g_ppointCF = CPointCF::Create()) == NULL){
  100.       hresult = E_OUTOFMEMORY;
  101.       goto LError1;
  102.     }
  103.     hresult = CoRegisterClassObject(
  104.       CLSID_CPoint,
  105.       g_ppointCF,
  106.       CLSCTX_LOCAL_SERVER,
  107.       REGCLS_MULTIPLEUSE,
  108.       &g_dwPointCF);
  109.     if(FAILED(hresult))
  110.       goto LError1;
  111.     // Register the CPoly Class Factory.
  112.     //
  113.     if((g_ppolyCF = CPolyCF::Create()) == NULL){
  114.       hresult = E_OUTOFMEMORY;
  115.       goto LError1;
  116.     }
  117.     hresult = CoRegisterClassObject(
  118.       CLSID_CPoly,
  119.       g_ppolyCF,
  120.       CLSCTX_LOCAL_SERVER,
  121.       REGCLS_MULTIPLEUSE,
  122.       &g_dwPolyCF);
  123.     if(FAILED(hresult))
  124.       goto LError1;
  125.     g_ppolyCF->Release();
  126.     g_ppointCF->Release();
  127.     return NOERROR;
  128. LError1:;
  129.     if(g_ppolyCF != NULL)
  130.       g_ppolyCF->Release();
  131.     if(g_ppointCF != NULL)
  132.       g_ppointCF->Release();
  133.     UninitOle();
  134. LError0:;
  135.     return hresult;
  136. }
  137. STDAPI 
  138. Revoke()
  139. {
  140.     if (!g_fObjectsRevoked) {
  141.       // Tell Ole to release our class factories.
  142.       //
  143.       if(g_dwPointCF != 0L)
  144.         CoRevokeClassObject(g_dwPointCF);
  145.       if(g_dwPolyCF != 0L)
  146.         CoRevokeClassObject(g_dwPolyCF);
  147.       g_fObjectsRevoked = 1;
  148.     }
  149.     return NOERROR;
  150. }
  151. STDAPI
  152. UninitOle()
  153. {
  154.     Revoke();
  155.     OleUninitialize();
  156.     return NOERROR;
  157. }
  158. /***
  159. *HRESULT SPolyGetIDsOfNames(MEMBERDESC*, unsigned int, char**, unsigned int, LCID, long*)
  160. *Purpose:
  161. *  This is the table driven implementation of IDispatch::GetIDsOfNames
  162. *  deferred to by both the CPoint and CPoly objects.
  163. *
  164. *Entry:
  165. *  rgmd = pointer to an array of method descriptors
  166. *  cMethods = number of elements in the array of method descriptors
  167. *  rgszNames = pointer to an array of names
  168. *  cNames = the number of names in the rgszNames array
  169. *  lcid = the callers locale ID
  170. *
  171. *Exit:
  172. *  return value = HRESULT
  173. *  rgdispid = array of name IDs corresponding to the rgszNames array
  174. *    this array will contain -1 for each entry that is not known.
  175. *
  176. ***********************************************************************/
  177. STDAPI
  178. SPolyGetIDsOfNames(
  179.     MEMBERDESC FAR* rgmd,
  180.     unsigned int cMethods,
  181.     OLECHAR FAR* FAR* rgszNames,
  182.     unsigned int cNames,
  183.     LCID lcid,
  184.     DISPID FAR* rgdispid)
  185. {
  186.     HRESULT hresult;
  187.     PARAM_DESC FAR* ppd;
  188.     MEMBERDESC FAR* pmd;
  189.     unsigned int iName, iTry, cParams;
  190.     hresult = NOERROR;
  191.     // first lookup the member name.
  192.     //
  193.     for(pmd = rgmd;; ++pmd){
  194.       if(pmd == &rgmd[cMethods])
  195.         goto LMemberNotFound;
  196. #if defined(WIN32) && !defined(UNICODE)
  197.       // CompareStringW is not available on Windows 95
  198.       if(wcsicmp(rgszNames[0], pmd->szName) == 0)
  199. #else
  200.       if(CompareString(lcid, NORM_IGNORECASE, rgszNames[0], -1, pmd->szName, -1) == 2)
  201. #endif
  202.       {
  203. rgdispid[0] = pmd->id;
  204. break;
  205.       }
  206.     }
  207.     // Lookup the named parameters, if there are any.
  208.     if(cNames > 1){
  209.       cParams = pmd->cParams;
  210.       for(iName = 1; iName < cNames; ++iName){
  211. for(iTry = 0;; ++iTry){
  212.   if(iTry == cParams){
  213.     hresult = DISP_E_UNKNOWNNAME;
  214.     rgdispid[iName] = -1;
  215.     break;
  216.   }
  217.   ppd = &pmd->rgpd[iTry];
  218. #if defined(WIN32) && !defined(UNICODE)
  219.           // CompareStringW is not available on Windows 95
  220.           if(wcsicmp(rgszNames[iName], ppd->szName) == 0)
  221. #else
  222.   if(CompareString(lcid, NORM_IGNORECASE, rgszNames[iName], -1, ppd->szName, -1) == 2)
  223. #endif
  224.   {
  225.     // The DISPID for a named parameter is defined to be its
  226.     // zero based positional index.  This routine assumes that
  227.     // that PARAM_DESC array was declared in correct textual order.
  228.     //
  229.     rgdispid[iName] = iTry;
  230.     break;
  231.   }
  232.         }
  233.       }
  234.     }
  235.     return hresult;
  236. LMemberNotFound:;
  237.     // If the member name is unknown, everything is unknown.
  238.     for(iName = 0; iName < cNames; ++iName)
  239.       rgdispid[iName] = -1;
  240.     return DISP_E_UNKNOWNNAME;
  241. }
  242. // disable unicode expansion for assertions
  243. #undef UNICODE
  244. void
  245. Assert(int fCond, char FAR* file, int line, char FAR* message)
  246. {
  247.     char * fmt;
  248.     char buf[128];
  249.     if(fCond)
  250.       return;
  251.     fmt = (message == NULL)
  252.       ? "Assertion failed: %s(%d)"
  253.       : "Assertion failed: %s(%d) '%s'";
  254.     sprintf(buf, fmt, file, line, message);
  255. #ifdef _MAC
  256.     DebugStr(c2pstr(buf));
  257. #else
  258. #ifdef WIN32
  259.     OutputDebugStringA(buf);
  260. #else //WIN32
  261.     OutputDebugString(buf);
  262. #endif //WIN32
  263.     DebugBreak();
  264. #endif
  265. }
  266. void IncObjectCount()
  267. {
  268.     g_cObjects++;
  269. }
  270. void DecObjectCount()
  271. {
  272.     g_cObjects--;
  273.     if (!g_cObjects && g_fQuit) {
  274.       Revoke();
  275. #ifndef _MAC
  276.       PostQuitMessage(0);
  277. #endif // !_MAC
  278.     }
  279. }