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

Windows编程

开发平台:

Visual C++

  1. /*************************************************************************
  2. **
  3. **  This is a part of the Microsoft Source Code Samples.
  4. **
  5. **  Copyright (C) 1992-1997 Microsoft Corporation. All rights reserved.
  6. **
  7. **  This source code is only intended as a supplement to Microsoft Development
  8. **  Tools and/or WinHelp documentation.  See these sources for detailed
  9. **  information regarding the Microsoft samples programs.
  10. **
  11. **  OLE Automation TypeLibrary Browse Helper Sample
  12. **
  13. **  main.cpp
  14. **
  15. **  new and delete operator redefinition to use memory manager of calling
  16. **  task.
  17. **  LibMain, WEP, DllGetClassObject, DllCanUnloadNow, DLL initialization.
  18. **  Procedure to create standard dispatch implementation.
  19. **
  20. **  Written by Microsoft Product Support Services, Windows Developer Support
  21. **
  22. *************************************************************************/
  23. #include <windows.h>
  24. #include <windowsx.h>
  25. #ifdef WIN16   
  26.   #include <ole2.h>
  27.   #include <compobj.h>    
  28.   #include <dispatch.h> 
  29.   #include <variant.h>
  30.   #include <olenls.h>  
  31. #endif 
  32. #include <initguid.h>
  33. #include "browseh.h"          
  34. // Globals
  35. HINSTANCE   g_hinst;                   // Instance of application
  36.                                        //Count number of objects and number of locks.
  37. ULONG       g_cObj=0;
  38. ULONG       g_cLock=0;
  39. // String resource buffers
  40. TCHAR g_szServerName[STR_LEN];
  41. /*
  42.  * new
  43.  *
  44.  * Purpose:
  45.  *   Since this is an InProcServer object, the memory allocator used by 
  46.  *   the calling task must be used.
  47.  *   This is done by redefining the global new operator and using new 
  48.  *   for all memory allocations.
  49.  */
  50. void FAR* operator new(size_t size)
  51. {
  52.     IMalloc FAR* pMalloc;
  53.     LPVOID lpv;
  54.     if (CoGetMalloc(MEMCTX_TASK, &pMalloc) == NOERROR)
  55.     {
  56.         lpv = pMalloc->Alloc(size);
  57.         pMalloc->Release();
  58.         return lpv;
  59.     }
  60.     return NULL;
  61. }
  62. /*
  63.  * delete
  64.  *
  65.  * Purpose:
  66.  *   Use the memory manager of the calling task to free memory.
  67.  */
  68. void operator delete(void FAR* lpv)
  69. {
  70.     IMalloc FAR* pMalloc;
  71.     if (lpv == NULL) return;
  72.     if( CoGetMalloc(MEMCTX_TASK, &pMalloc) == NOERROR) 
  73.     {
  74.         if (pMalloc->DidAlloc(lpv))
  75.             pMalloc->Free(lpv);
  76.         pMalloc->Release();
  77.     }
  78. }
  79. #ifdef WIN16
  80. /*
  81.  * LibMain
  82.  *
  83.  * Purpose:
  84.  *  Called by Win16 on DLL load. Does any one-time initializations.
  85.  *
  86.  */
  87. int PASCAL LibMain (HINSTANCE hinst, WORD wDataSeg, WORD cbHeapSize, LPSTR lpCmdLine)
  88. {
  89.    if (cbHeapSize != 0)
  90.        UnlockData(0);
  91.    
  92.    g_hinst = hinst;    
  93.    if (!InitDLL(hinst))
  94.          return FALSE;
  95.    return TRUE;
  96. }
  97. /*
  98.  * WEP
  99.  *
  100.  * Purpose:
  101.  *  Called by Windows on DLL unload. 
  102.  *
  103.  */
  104. extern "C" void FAR PASCAL _WEP(int bSystemExit)
  105. {
  106.     return;
  107. }
  108. #else //Win 32
  109. BOOL WINAPI DllMain (HINSTANCE hinst, DWORD dwReason, LPVOID lpReserved)
  110. {
  111.     switch (dwReason)
  112.     {
  113.         case DLL_PROCESS_ATTACH:
  114.             if (!InitDLL(hinst))
  115.                 return FALSE;
  116.             else return TRUE;
  117.         default:
  118.             return TRUE;
  119.     }
  120. }
  121. #endif 
  122. /*
  123.  * DLLGetClassObject
  124.  *
  125.  * Purpose:
  126.  *  OLE calls this funtion to obtain the class factory. Note that the class 
  127.  *  factory is not registered by the inproc server. 
  128.  *
  129.  */
  130. STDAPI DllGetClassObject(REFCLSID rclsid, REFIID riid,
  131.                                    LPVOID FAR *ppv)
  132. {    
  133.     LPCLASSFACTORY pcf;
  134.     HRESULT hr;
  135.     
  136.     *ppv =  NULL;
  137.     
  138.     // Check if this CLSID is supported.
  139.     if (rclsid != CLSID_BrowseHelper)
  140.        return E_FAIL;
  141.     
  142.     // Create class factory and return it  
  143.     pcf = new CBrowseHelperCF;  
  144.     if (!pcf)
  145.         return E_OUTOFMEMORY;  
  146.     hr = pcf->QueryInterface(riid, ppv);
  147.     if (FAILED(hr)) 
  148.     {
  149.         delete pcf;
  150.         return hr;
  151.     }          
  152.     return NOERROR;
  153. }
  154. /*
  155.  * DLLCanUnloadNow
  156.  *
  157.  * Purpose:
  158.  *  DllCanUnloadNow is called by OLE to determine if the DLL can be unloded. 
  159.  *
  160.  */
  161. STDAPI DllCanUnloadNow(void)
  162. {  
  163.     if (g_cObj==0L && g_cLock==0L)
  164.         return S_OK;
  165.     else return S_FALSE;
  166. }     
  167. /*
  168.  * InitDLL
  169.  *
  170.  * Purpose:
  171.  *  Load strings & Registers the window class
  172.  *
  173.  * Parameters:
  174.  *  hinstance       hinstance of application
  175.  *
  176.  */
  177. BOOL InitDLL (HINSTANCE hinst)
  178. {  
  179.    return LoadString(hinst, IDS_SERVERNAME, g_szServerName, sizeof(g_szServerName));
  180. }
  181. /*
  182.  * Quick & Dirty ANSI/Unicode conversion routines. These routines use a static
  183.  * buffer of fixed size to hold the converted string. Consequently these
  184.  * routines are limited to strings of size STRCONVERT_MAXLEN. Also the same
  185.  * buffer is reused when the routine is called a second time. So make sure
  186.  * that the converted string is used before the conversion routine is called
  187.  * again
  188.  */
  189. #ifdef WIN32
  190. #ifndef UNICODE
  191. char* ConvertToAnsi(OLECHAR FAR* szW)
  192. {
  193.   static char achA[STRCONVERT_MAXLEN]; 
  194.   
  195.   WideCharToMultiByte(CP_ACP, 0, szW, -1, achA, STRCONVERT_MAXLEN, NULL, NULL);  
  196.   return achA; 
  197. OLECHAR* ConvertToUnicode(char FAR* szA)
  198. {
  199.   static OLECHAR achW[STRCONVERT_MAXLEN]; 
  200.   MultiByteToWideChar(CP_ACP, 0, szA, -1, achW, STRCONVERT_MAXLEN);  
  201.   return achW; 
  202. }
  203. #endif
  204. #endif