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

Windows编程

开发平台:

Visual C++

  1. /*
  2.  * OLE2UI.C
  3.  *
  4.  * Contains initialization routines and miscellaneous API implementations for
  5.  * the OLE 2.0 User Interface Support Library.
  6.  *
  7.  * Copyright (c)1992-1996 Microsoft Corporation, All Right Reserved
  8.  */
  9. #define STRICT  1
  10. #include "olestd.h"
  11. #include "common.h"
  12. #include "utility.h"
  13. #include <commdlg.h>
  14. #include "malspy.h"
  15. OLEDBGDATA
  16. #define WINDLL  1           // make far pointer version of stdargs.h
  17. #include <stdarg.h>
  18. //The instance handle shared amongst all dialogs.
  19. HINSTANCE     ghInst;
  20. // object count, used to support DllCanUnloadNow and OleUICanUnloadNow
  21. DWORD g_dwObjectCount=0;
  22. DWORD g_dwLockCount=0;
  23. //Registered messages for use with all the dialogs, registered in LibMain
  24. UINT        uMsgHelp=0;
  25. UINT        uMsgEndDialog=0;
  26. UINT        uMsgBrowse=0;
  27. UINT        uMsgChangeIcon=0;
  28. UINT        uMsgFileOKString=0;
  29. UINT        uMsgCloseBusyDlg=0;
  30. //Clipboard formats used by PasteSpecial
  31. UINT  cfObjectDescriptor;
  32. UINT  cfLinkSrcDescriptor;
  33. UINT  cfEmbedSource;
  34. UINT  cfEmbeddedObject;
  35. UINT  cfLinkSource;
  36. UINT  cfOwnerLink;
  37. UINT  cfFileName;
  38. // local definition
  39. #define WM_U_UPDATELINK WM_USER
  40. /*
  41.  * OleStdInitialize
  42.  *
  43.  * NOTE: This function should be called by your application before using any of
  44.  *       the functions found in this library.
  45.  *
  46.  * Purpose:
  47.  *   Initializes the OLE UI Library.
  48.  *
  49.  * Parameters:
  50.  *
  51.  *  hInstance       HINSTANCE of the module where the UI library resources
  52.  *                  and Dialog Procedures are contained.  If you are calling
  53.  *                  this function yourself, this should be the instance handle
  54.  *                  of your application.
  55.  *
  56.  *  hPrevInst       HINSTANCE of the previous application instance.
  57.  *                  This is the parameter passed in to your WinMain.  For
  58.  *                  the DLL version, this should always be set to zero (for
  59.  *                  WIN16 DLLs).
  60.  *
  61.  * Return Value:
  62.  *  BOOL            TRUE if initialization was successful.
  63.  *                  FALSE if either the "Magic Number" did not verify, or one of
  64.  *                  the window classes could not be registered.  If the
  65.  *                  "Magic Number" did not verify, then the resources
  66.  *                  in your module are of a different version than the
  67.  *                  ones you compiled with.
  68.  */
  69. STDAPI_(BOOL) OleStdInitialize(HINSTANCE hInstance)
  70. {
  71.    OleDbgOut1("OleStdInitialize called.rn");
  72.    ghInst=hInstance;
  73.    // Register Clipboard Formats used by PasteSpecial dialog.
  74.    cfObjectDescriptor = RegisterClipboardFormat(CF_OBJECTDESCRIPTOR);
  75.    cfLinkSrcDescriptor= RegisterClipboardFormat(CF_LINKSRCDESCRIPTOR);
  76.    cfEmbedSource      = RegisterClipboardFormat(CF_EMBEDSOURCE);
  77.    cfEmbeddedObject   = RegisterClipboardFormat(CF_EMBEDDEDOBJECT);
  78.    cfLinkSource       = RegisterClipboardFormat(CF_LINKSOURCE);
  79.    cfOwnerLink        = RegisterClipboardFormat(CF_OWNERLINK);
  80.    cfFileName         = RegisterClipboardFormat(CF_FILENAME);
  81. #ifdef TRACEMEM
  82.    return (InitializeMallocSpy());
  83. #else
  84.    return (TRUE);
  85. #endif
  86. }
  87. STDAPI_(void) OleStdUninitialize(void)
  88. {
  89. #ifdef TRACEMEM
  90.    UninitializeMallocSpy();
  91. #endif
  92. }
  93. /*
  94.  * OleUICanUnloadNow
  95.  *
  96.  * NOTE: if you link to this library and you implement
  97.  *       DllCanUnloadNow, then you must call this routine in your
  98.  *       implementation of DllCanUnloadNow to determine if you can be
  99.  *       unloaded or not.
  100.  *
  101.  * Purpose:
  102.  *   Determines when it is safe to go away
  103.  *   (ie. there are no existing object instances).
  104.  *
  105.  * Return Value:
  106.  *   HRESULT    NOERROR it is safe to go away, S_FALSE this code must stay
  107.  *              loaded.
  108.  *
  109.  * Comments:
  110.  *
  111.  *   If an INPROC server DLL links to the OLESTD library,
  112.  *   then the OleUILockLibrary function should NOT be used.
  113.  *   instead the INPROC server DLL should call OleUICanUnloadNow API from
  114.  *   within its own DllCanUnloadNow function. The idea here is, that if there
  115.  *   are any existing instance of objects created by the OLESTD library
  116.  *   functions (eg. EnumFORMATETC objects created by OleStdEnumFmtEtc_Create)
  117.  *   then, the INPROC server DLL must NOT let itself be unloaded.
  118.  *
  119.  *   An EXE based object using the OLESTD libray need NOT use either the
  120.  *   OleUILockLibrary or OleUICanUnloadNow functions. All objects created
  121.  *   by the OLESTD library will have LRPC proxies and stubs created to
  122.  *   manage remoting method calls. the worst that can happen when the EXE
  123.  *   exits is that any outstanding proxies for unreleased objects will get
  124.  *   RPC_E_SERVERDIED errors; they will not GPFault.
  125.  */
  126. STDAPI OleUICanUnloadNow()
  127. {
  128.   if (g_dwObjectCount == 0) {
  129.    return NOERROR;
  130.   }
  131.   return S_FALSE;
  132. }