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

Windows编程

开发平台:

Visual C++

  1. /*
  2.  *  WRAP3D.C
  3.  */
  4. #include <windows.h>
  5. #include <mapix.h>
  6. #ifdef  WIN16
  7. #include <memory.h>
  8. #endif  
  9. #include <mapiwin.h>
  10. #include "wrap3d.h"
  11. STDAPI_(LPVOID)
  12. CTL3D_Initialize(HINSTANCE hinstMe)
  13. {
  14.     UINT        fuErr;
  15.     HINSTANCE   hinst = 0;
  16.     BOOL        fRegistered = FALSE;    /* assume failure */
  17.     FARPROC     fpEnabled;
  18.     FARPROC     fpRegister;
  19.     LPCTX3D     pctx = NULL;
  20.     DWORD       dwVer;
  21.     /*
  22.      * //$ If the Win 4 shell is present, don't even look for the DLL.
  23.      * //$ Need to verify this algorithm.
  24.      */
  25.     dwVer = GetVersion();
  26.     if (LOBYTE(LOWORD(dwVer)) >= 4)
  27.         goto fail;
  28. #ifdef _WIN32
  29.     pctx = LocalAlloc(LPTR, sizeof(CTX3D));
  30.     if (!pctx)
  31.         goto fail;
  32. #else
  33.     if (MAPIAllocateBuffer(sizeof(CTX3D), &pctx))
  34.         goto fail;
  35. #endif
  36.     ZeroMemory(pctx, sizeof(CTX3D));
  37.     /* Attempt to load the DLL. Do not allow any error messages. */
  38.     fuErr = SetErrorMode(SEM_NOOPENFILEERRORBOX);
  39. #ifdef  _WIN32
  40.     hinst = LoadLibraryA("CTL3D32.DLL");
  41.     SetErrorMode(fuErr);
  42.     if (!hinst)
  43.         goto fail;
  44. #else
  45.     hinst = LoadLibrary("CTL3DV2.DLL");
  46.     SetErrorMode(fuErr);
  47.     if (hinst < HINSTANCE_ERROR)
  48.         goto fail;
  49. #endif
  50.     /* Get the entry points we need. */
  51.     if (!(fpEnabled = GetProcAddress(hinst, "Ctl3dEnabled")))
  52.         goto fail;
  53.     if (!(fpRegister = GetProcAddress(hinst, "Ctl3dRegister")))
  54.         goto fail;
  55.     if (!(pctx->fpUnregister = GetProcAddress(hinst, "Ctl3dUnregister")))
  56.         goto fail;
  57.     if (!(pctx->fpSubclassDlgEx = GetProcAddress(hinst, "Ctl3dSubclassDlgEx")))
  58.         goto fail;
  59.     if (!(pctx->fpColorChange = GetProcAddress(hinst, "Ctl3dColorChange")))
  60.         goto fail;
  61.     if ((pctx->fpIsAutoSubclass = GetProcAddress(hinst, "Ctl3dIsAutoSubclass")) &&
  62.         (!(pctx->fpAutoSubclass = GetProcAddress(hinst, "Ctl3dAutoSubclass")) ||
  63.         !(pctx->fpUnAutoSubclass = GetProcAddress(hinst, "Ctl3dUnAutoSubclass"))))
  64.         goto fail;
  65.     if (!(pctx->fpSubclassCtl = GetProcAddress(hinst, "Ctl3dSubclassCtl")))
  66.         goto fail;
  67.     if (!(pctx->fpGetVer = GetProcAddress(hinst, "Ctl3dGetVer")))
  68.         goto fail;
  69.     /* If we were not already registered, do so. */
  70.     if (!(*fpEnabled)())
  71.         pctx->fRegistered = (*fpRegister)(hinstMe);
  72.     /* Remember the library handle. */
  73.     pctx->hinst = hinst;
  74.     pctx->hinstMe = hinstMe;
  75. ret:
  76.     return pctx;
  77. fail:
  78.     if (hinst)
  79.         FreeLibrary(hinst);
  80. #ifdef  _WIN32
  81.     if (pctx)
  82.         LocalFree(pctx);
  83. #else
  84.     MAPIFreeBuffer(pctx);
  85. #endif  
  86.     pctx = NULL;
  87.     goto ret;
  88. }
  89. STDAPI_(void)
  90. CTL3D_Uninitialize(LPVOID lpv)
  91. {
  92.     LPCTX3D pctx;
  93.     if (!(pctx = (LPCTX3D) lpv))
  94.         return;
  95.     if (pctx->fRegistered)
  96.         (*(pctx->fpUnregister))(pctx->hinstMe);
  97.     FreeLibrary(pctx->hinst);
  98. #ifdef  _WIN32
  99.     LocalFree(pctx);
  100. #else
  101.     MAPIFreeBuffer(pctx);
  102. #endif  
  103. }
  104. STDAPI_(void)
  105. CTL3D_Subclass(LPVOID lpv, HWND hwnd, DWORD dwFlags)
  106. {
  107.     LPCTX3D pctx;
  108.     if (!(pctx = (LPCTX3D) lpv))
  109.         return;
  110.     (*(pctx->fpSubclassDlgEx))(hwnd, dwFlags);
  111. }
  112. STDAPI_(void)
  113. CTL3D_AutoSubclass(LPVOID lpv, HINSTANCE hinst, BOOL FAR * lpfAuto)
  114. {
  115.     LPCTX3D pctx;
  116.     *lpfAuto = FALSE;
  117.     if (!(pctx = (LPCTX3D) lpv) || !pctx->fpIsAutoSubclass)
  118.         return;
  119.     if (*lpfAuto = !pctx->fpIsAutoSubclass())
  120.         pctx->fpAutoSubclass (hinst);
  121.     return;
  122. }
  123. STDAPI_(BOOL)
  124. CTL3D_IsAutoSubclass(LPVOID lpv)
  125. {
  126.     LPCTX3D pctx;
  127.     if (!(pctx = (LPCTX3D) lpv) || !pctx->fpIsAutoSubclass)
  128.         return FALSE;
  129.     return pctx->fpIsAutoSubclass();
  130. }
  131. STDAPI_(void)
  132. CTL3D_CeaseAutoSubclass(LPVOID lpv, BOOL fAuto)
  133. {
  134.     LPCTX3D pctx;
  135.     if (!(pctx = (LPCTX3D) lpv) || !fAuto)
  136.         return;
  137.     pctx->fpUnAutoSubclass ();
  138.     return;
  139. }
  140. STDAPI_(BOOL)
  141. CTL3D_ColorChange(LPVOID lpv)
  142. {
  143.     LPCTX3D pctx;
  144.     if (!(pctx = (LPCTX3D) lpv))
  145.         return FALSE;
  146.     return pctx->fpColorChange();
  147. }
  148. STDAPI_(BOOL)
  149. CTL3D_SubclassCtl(LPVOID lpv, HWND hwnd)
  150. {
  151.     LPCTX3D pctx;
  152.     if (!(pctx = (LPCTX3D) lpv))
  153.         return FALSE;
  154.     return pctx->fpSubclassCtl(hwnd);
  155. }
  156. STDAPI_(WORD)
  157. CTL3D_GetVer(LPVOID lpv)
  158. {
  159.     LPCTX3D pctx;
  160.     if (!(pctx = (LPCTX3D) lpv))
  161.         return 0;
  162.     return pctx->fpGetVer();
  163. }