home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD2.mdf / c / library / mslang / safctl / uty99ctl.cpp < prev    next >
Encoding:
C/C++ Source or Header  |  1994-05-18  |  18.4 KB  |  783 lines

  1. /*******************************************************************
  2. ********************************************************************
  3.  File Name  :  UTY99CTL.CPP
  4.  
  5.  Description:  Implementation of SAFCtl3dV2 class
  6.  
  7.  Change Log :  05/01/94
  8.                KENWAL              
  9.                New Program
  10.  
  11. ********************************************************************
  12. *******************************************************************/
  13. //include stdafx.h for MFC precompiled headers.  Create a empty
  14. //header file if you don't have this header file.
  15.  
  16. #include "stdafx.h"
  17.  
  18. #include <windows.h>
  19. #include <lzexpand.h>
  20. #include <toolhelp.h>
  21. #include <string.h>
  22. #include <uty99ctl.h>
  23.  
  24. /*******************************************************************
  25.      Function    : SAFCtl3dV2::SAFCtl3dV2
  26.  
  27.      Description :
  28.  
  29.      Parameters  : 
  30.  
  31.      Return Value: NONE 
  32.  
  33.      Comments    :
  34. ********************************************************************/
  35.  
  36. SAFCtl3dV2::SAFCtl3dV2()
  37. {
  38.    InitPrivate();
  39.  
  40. }
  41.                          
  42. /*******************************************************************
  43.      Function    : SAFCtl3dV2::SAFCtl3dV2(BOOL bAuto)
  44.  
  45.      Description :
  46.  
  47.      Parameters  : 
  48.  
  49.      Return Value: NONE 
  50.  
  51.      Comments    :
  52. ********************************************************************/
  53.  
  54. SAFCtl3dV2::SAFCtl3dV2(BOOL bAuto)
  55. {
  56.    InitPrivate();
  57.  
  58.    if (bAuto)
  59.    {          
  60.       AutoAuto();        
  61.    }   
  62. }
  63.  
  64.  
  65. /*******************************************************************
  66.      Function    : SAFCtl3dV2::~SAFCtl3dV2
  67.  
  68.      Description :
  69.  
  70.      Parameters  : 
  71.  
  72.      Return Value: NONE 
  73.  
  74.      Comments    :
  75. ********************************************************************/
  76.  
  77. SAFCtl3dV2::~SAFCtl3dV2()
  78. {
  79.  
  80.    if (_hinstSelfAuto)
  81.    {
  82.       Ctl3dUnregister(_hinstSelfAuto);  
  83.    }
  84.  
  85.    //free module
  86.    if (_hinstDll)
  87.       FreeLibrary(_hinstDll);
  88. }
  89.  
  90. /*******************************************************************
  91.      Function    : SAFCtl3dV2::Auto
  92.  
  93.      Description :
  94.  
  95.      Parameters  :   
  96.  
  97.      Return Value: BOOL
  98.  
  99.      Comments    :
  100. ********************************************************************/
  101.  
  102. BOOL SAFCtl3dV2::Auto(HINSTANCE hInstApp)
  103. {                  
  104.  
  105.    if (hInstApp)
  106.    {
  107.       if (Ctl3dRegister(hInstApp))
  108.          if (Ctl3dAutoSubclass(hInstApp))
  109.             _hinstSelfAuto = hInstApp;
  110.    }
  111.    else
  112.    {
  113.       AutoAuto();     
  114.    }   
  115.                            
  116.    if (_hinstSelfAuto)
  117.       return TRUE;
  118.    else
  119.       return FALSE;   
  120. }
  121.  
  122. /*******************************************************************
  123.      Function    : SAFCtl3dV2::Init
  124.  
  125.      Description :
  126.  
  127.      Parameters  : 
  128.  
  129.      Return Value: BOOL
  130.  
  131.      Comments    :
  132. ********************************************************************/
  133.  
  134. BOOL SAFCtl3dV2::Init()
  135. {                            
  136.    //load the library - only run one from the \windows\system directory
  137.    char * pszBuf = new char[157];
  138.    if (!pszBuf)
  139.       return FALSE;
  140.    
  141.    UINT uRet = GetSystemDirectory(pszBuf,144 );   //leave room for dll name
  142.    
  143.    if (uRet > 144)
  144.    {
  145.       delete [] pszBuf;
  146.       pszBuf = new char[uRet + 13];
  147.       if (!pszBuf)
  148.          return FALSE;
  149.       
  150.       uRet = GetSystemDirectory(pszBuf, uRet );
  151.          
  152.    }                     
  153.    
  154.    if (uRet == 0)
  155.    {
  156.       _sError = CCTL3D_E_OUTOFMEMORY;
  157.       return FALSE;
  158.    }         
  159.    
  160.    //handle case of system on root drive
  161.    if (pszBuf[strlen(pszBuf) -1] != '\\')
  162.       strcat(pszBuf, "\\");
  163.                   
  164.    strcat(pszBuf, "ctl3dv2.dll");
  165.    //see if the file is there before trying a load library
  166.    HINSTANCE hinstTemp = NULL;
  167.    OFSTRUCT ofTest;
  168.    HFILE hFileTest = OpenFile(pszBuf, &ofTest, OF_EXIST);
  169.  
  170.    if (hFileTest != HFILE_ERROR)
  171.       hinstTemp = LoadLibrary(pszBuf);
  172.  
  173.    if (hinstTemp >= HINSTANCE_ERROR)
  174.    {
  175.       //get all the function pointers
  176.       _hinstDll = hinstTemp;
  177.       GetFunctions();
  178.       _bInit = TRUE;
  179.    }                                 
  180.    else
  181.    {
  182.       //try to find the dll and copy it to the windows system directory if possible
  183.       //first see if the dll is in memory... 
  184.       HMODULE hmod = GetModuleHandle("ctl3dv2");
  185.       if (!hmod)  //not in memory
  186.       {
  187.          //then try to find it
  188.          OFSTRUCT of;
  189.          OFSTRUCT ofDest;
  190.          HFILE hFile = OpenFile("ctl3dv2.dll", &of, OF_READ | OF_SEARCH  );
  191.          HFILE hFileDest;
  192.          if (hFile != HFILE_ERROR)
  193.          {                                                    
  194.             LONG lCopyRet = -1;
  195.             //copy file and load
  196.             hFileDest = OpenFile(pszBuf, &ofDest, OF_CREATE);
  197.  
  198.             if (hFileDest != HFILE_ERROR) 
  199.             {
  200.                lCopyRet = DoCopy(hFile, hFileDest);
  201.                _lclose(hFileDest);
  202.             }
  203.             
  204.             _lclose(hFile);                                
  205.                  
  206.             if (lCopyRet > 0)
  207.                hinstTemp = LoadLibrary(pszBuf);
  208.                
  209.             if (hinstTemp >= HINSTANCE_ERROR)
  210.             {
  211.                //get all the function pointers
  212.                _hinstDll = hinstTemp;
  213.                GetFunctions();
  214.                _bInit = TRUE;
  215.             } 
  216.             
  217.             
  218.             
  219.          }
  220.  
  221.       }
  222.       
  223.    }
  224.        
  225.    if (!_bInit && (_sError == CCTL3D_OK))               
  226.       _sError = CCTL3D_E_LOADFAIL;
  227.  
  228.  
  229.    delete [] pszBuf;   
  230.    
  231.    return TRUE;
  232.    
  233. }                                            
  234. /*******************************************************************
  235.      Function    : SAFCtl3dV2::GetLastError
  236.  
  237.      Description :
  238.  
  239.      Parameters  : 
  240.  
  241.      Return Value: SHORT
  242.  
  243.      Comments    :
  244. ********************************************************************/
  245.  
  246. SHORT SAFCtl3dV2::GetLastError()
  247. {
  248.    return _sError;
  249. }
  250.  
  251. /*******************************************************************
  252.      Function    : WINAPI SAFCtl3dV2::Ctl3dSubclassDlg
  253.  
  254.      Description :
  255.  
  256.      Parameters  : 
  257.  
  258.      Return Value: BOOL
  259.  
  260.      Comments    :
  261. ********************************************************************/
  262.  
  263. BOOL WINAPI SAFCtl3dV2::Ctl3dSubclassDlg(HWND hwnd, WORD w)
  264. {                 
  265.                 
  266.    _sError = CCTL3D_OK;
  267.                    
  268.    if (!_bInit)
  269.       Init();
  270.  
  271.    if (!_bInit)
  272.       return FALSE;  
  273.       
  274.    if (_pfnCtl3dSubclassDlg)
  275.    {
  276.       return _pfnCtl3dSubclassDlg(hwnd, w);                 
  277.  
  278.    }
  279.    
  280.    _sError = CCTL3D_E_NOFUNCTION;
  281.    return FALSE;   
  282. }
  283. /*******************************************************************
  284.      Function    : WINAPI SAFCtl3dV2::Ctl3dSubclassDlgEx
  285.  
  286.      Description :
  287.  
  288.      Parameters  : 
  289.  
  290.      Return Value: BOOL
  291.  
  292.      Comments    :
  293. ********************************************************************/
  294.  
  295. BOOL WINAPI SAFCtl3dV2::Ctl3dSubclassDlgEx(HWND hwnd, DWORD dw)
  296. {     
  297.    _sError = CCTL3D_OK;
  298.                    
  299.    if (!_bInit)
  300.       Init();
  301.  
  302.    if (!_bInit)
  303.       return FALSE;  
  304.       
  305.    if (_pfnCtl3dSubclassDlgEx)
  306.    {
  307.       return _pfnCtl3dSubclassDlgEx(hwnd, dw);
  308.    }
  309.    
  310.    _sError = CCTL3D_E_NOFUNCTION;
  311.    return FALSE;   
  312.  
  313. }
  314. /*******************************************************************
  315.      Function    : WINAPI SAFCtl3dV2::Ctl3dGetVer
  316.  
  317.      Description :
  318.  
  319.      Parameters  : 
  320.  
  321.      Return Value: WORD
  322.  
  323.      Comments    :
  324. ********************************************************************/
  325.  
  326. WORD WINAPI SAFCtl3dV2::Ctl3dGetVer(void)
  327. {
  328.    _sError = CCTL3D_OK;
  329.                    
  330.    if (!_bInit)
  331.       Init();
  332.  
  333.    if (!_bInit)
  334.       return FALSE;  
  335.       
  336.    if (_pfnCtl3dGetVer)
  337.    {
  338.       return _pfnCtl3dGetVer();
  339.    }
  340.    
  341.    _sError = CCTL3D_E_NOFUNCTION;
  342.    return 0;   
  343.  
  344.  
  345.  
  346. }
  347. /*******************************************************************
  348.      Function    : WINAPI SAFCtl3dV2::Ctl3dEnabled
  349.  
  350.      Description :
  351.  
  352.      Parameters  : 
  353.  
  354.      Return Value: BOOL
  355.  
  356.      Comments    :
  357. ********************************************************************/
  358.  
  359. BOOL WINAPI SAFCtl3dV2::Ctl3dEnabled(void)
  360. {                     
  361.    _sError = CCTL3D_OK;
  362.                    
  363.    if (!_bInit)
  364.       Init();
  365.  
  366.    if (!_bInit)
  367.       return FALSE;  
  368.       
  369.    if (_pfnCtl3dEnabled)
  370.    {
  371.       return _pfnCtl3dEnabled();
  372.    }
  373.    
  374.    _sError = CCTL3D_E_NOFUNCTION;
  375.    return FALSE;   
  376.  
  377.  
  378. }
  379. /*******************************************************************
  380.      Function    : WINAPI SAFCtl3dV2::Ctl3dCtlColorEx
  381.  
  382.      Description :
  383.  
  384.      Parameters  : 
  385.  
  386.      Return Value: HBRUSH
  387.  
  388.      Comments    :
  389. ********************************************************************/
  390.  
  391. HBRUSH WINAPI SAFCtl3dV2::Ctl3dCtlColorEx(UINT wm, WPARAM wParam, LPARAM lParam)
  392. {                   
  393.    _sError = CCTL3D_OK;
  394.                    
  395.    if (!_bInit)
  396.       Init();
  397.  
  398.    if (!_bInit)
  399.       return FALSE;  
  400.       
  401.    if (_pfnCtl3dCtlColorEx)
  402.    {
  403.       return _pfnCtl3dCtlColorEx(wm, wParam, lParam);
  404.    }
  405.    
  406.    _sError = CCTL3D_E_NOFUNCTION;
  407.    return NULL;   
  408.  
  409.  
  410. }
  411. /*******************************************************************
  412.      Function    : WINAPI SAFCtl3dV2::Ctl3dColorChange
  413.  
  414.      Description :
  415.  
  416.      Parameters  : 
  417.  
  418.      Return Value: BOOL
  419.  
  420.      Comments    :
  421. ********************************************************************/
  422.  
  423. BOOL WINAPI SAFCtl3dV2::Ctl3dColorChange(void)
  424. {                                
  425.    _sError = CCTL3D_OK;
  426.                    
  427.    if (!_bInit)
  428.       Init();
  429.  
  430.    if (!_bInit)
  431.       return FALSE;  
  432.       
  433.    if (_pfnCtl3dColorChange)
  434.    {
  435.       return _pfnCtl3dColorChange();
  436.    }
  437.    
  438.    _sError = CCTL3D_E_NOFUNCTION;
  439.    return FALSE;   
  440.  
  441.  
  442. }
  443. /*******************************************************************
  444.      Function    : WINAPI SAFCtl3dV2::Ctl3dSubclassCtl
  445.  
  446.      Description :
  447.  
  448.      Parameters  : 
  449.  
  450.      Return Value: BOOL
  451.  
  452.      Comments    :
  453. ********************************************************************/
  454.  
  455. BOOL WINAPI SAFCtl3dV2::Ctl3dSubclassCtl(HWND hwnd)
  456. {                
  457.    _sError = CCTL3D_OK;
  458.                    
  459.    if (!_bInit)
  460.       Init();
  461.  
  462.    if (!_bInit)
  463.       return FALSE;  
  464.       
  465.    if (_pfnCtl3dSubclassCtl)
  466.    {
  467.       return _pfnCtl3dSubclassCtl(hwnd);
  468.    }
  469.    
  470.    _sError = CCTL3D_E_NOFUNCTION;
  471.    return FALSE;   
  472.  
  473.  
  474. }
  475. /*******************************************************************
  476.      Function    : WINAPI SAFCtl3dV2::Ctl3dDlgFramePaint
  477.  
  478.      Description :
  479.  
  480.      Parameters  : 
  481.  
  482.      Return Value: LONG
  483.  
  484.      Comments    :
  485. ********************************************************************/
  486.  
  487. LONG WINAPI SAFCtl3dV2::Ctl3dDlgFramePaint(HWND hwnd, UINT u, WPARAM w , LPARAM l)
  488. {                                               
  489.    _sError = CCTL3D_OK;
  490.                    
  491.    if (!_bInit)
  492.       Init();
  493.  
  494.    if (!_bInit)
  495.       return FALSE;  
  496.       
  497.    if (_pfnCtl3dDlgFramePaint)
  498.    {
  499.       return _pfnCtl3dDlgFramePaint(hwnd, u, w, l);
  500.    }
  501.    
  502.    _sError = CCTL3D_E_NOFUNCTION;
  503.    return 0L;   
  504.  
  505.  
  506. }
  507. /*******************************************************************
  508.      Function    : WINAPI SAFCtl3dV2::Ctl3dAutoSubclass
  509.  
  510.      Description :
  511.  
  512.      Parameters  : 
  513.  
  514.      Return Value: BOOL
  515.  
  516.      Comments    :
  517. ********************************************************************/
  518.  
  519. BOOL WINAPI SAFCtl3dV2::Ctl3dAutoSubclass(HINSTANCE hInst)
  520. {                                    
  521.    _sError = CCTL3D_OK;
  522.                    
  523.    if (!_bInit)
  524.       Init();
  525.  
  526.    if (!_bInit)
  527.       return FALSE;  
  528.       
  529.    if (_pfnCtl3dAutoSubclass)
  530.    {
  531.       return _pfnCtl3dAutoSubclass(hInst);
  532.    }
  533.    
  534.    _sError = CCTL3D_E_NOFUNCTION;
  535.    return FALSE;   
  536.  
  537.  
  538. }
  539.  
  540. /*******************************************************************
  541.      Function    : WINAPI SAFCtl3dV2::Ctl3dRegister
  542.  
  543.      Description :
  544.  
  545.      Parameters  : 
  546.  
  547.      Return Value: BOOL
  548.  
  549.      Comments    :
  550. ********************************************************************/
  551.  
  552. BOOL WINAPI SAFCtl3dV2::Ctl3dRegister(HINSTANCE hInst)
  553. {
  554.    _sError = CCTL3D_OK;
  555.                    
  556.    if (!_bInit)
  557.       Init();
  558.  
  559.    if (!_bInit)
  560.       return FALSE;  
  561.       
  562.    if (_pfnCtl3dRegister)
  563.    {
  564.       return _pfnCtl3dRegister(hInst);
  565.    }
  566.    
  567.    _sError = CCTL3D_E_NOFUNCTION;
  568.    return FALSE;   
  569.  
  570. }
  571. /*******************************************************************
  572.      Function    : WINAPI SAFCtl3dV2::Ctl3dUnregister
  573.  
  574.      Description :
  575.  
  576.      Parameters  : 
  577.  
  578.      Return Value: BOOL
  579.  
  580.      Comments    :
  581. ********************************************************************/
  582.  
  583. BOOL WINAPI SAFCtl3dV2::Ctl3dUnregister(HINSTANCE hInst)
  584. {
  585.    _sError = CCTL3D_OK;
  586.                    
  587.    if (!_bInit)
  588.       Init();
  589.  
  590.    if (!_bInit)
  591.       return FALSE;  
  592.                           
  593.    if (_pfnCtl3dUnregister)
  594.    {
  595.       return _pfnCtl3dUnregister(hInst);
  596.    }
  597.    
  598.    _sError = CCTL3D_E_NOFUNCTION;
  599.    return FALSE;   
  600.  
  601.  
  602. }
  603.    
  604. /*******************************************************************
  605.      Function    : SAFCtl3dV2::GetFunctions
  606.  
  607.      Description :
  608.  
  609.      Parameters  : 
  610.  
  611.      Return Value: void
  612.  
  613.      Comments    :
  614. ********************************************************************/
  615.  
  616. void SAFCtl3dV2::GetFunctions()
  617. {
  618.       
  619.    _pfnCtl3dSubclassDlg = (PFNSUBCLASSDLG)GetProcAddress(_hinstDll, "Ctl3dSubclassDlg");
  620.    _pfnCtl3dSubclassDlgEx = (PFNSUBCLASSDLGEX)GetProcAddress(_hinstDll, "Ctl3dSubclassDlgEx");
  621.    _pfnCtl3dGetVer = (PFNGETVER)GetProcAddress(_hinstDll,"Ctl3dGetVer");
  622.    _pfnCtl3dEnabled = (PFNENABLED)GetProcAddress(_hinstDll,"Ctl3dEnabled");
  623.    _pfnCtl3dCtlColorEx = (PFNCTLCOLOREX)GetProcAddress(_hinstDll,"Ctl3dCtlColorEx");
  624.    _pfnCtl3dColorChange = (PFNCOLORCHANGE)GetProcAddress(_hinstDll,"Ctl3dColorChange");
  625.    _pfnCtl3dSubclassCtl = (PFNSUBCLASSCTL)GetProcAddress(_hinstDll, "Ctl3dSubclassCtl");
  626.    _pfnCtl3dDlgFramePaint = (PFNDLGFRAMEPAINT)GetProcAddress(_hinstDll, "Ctl3dDlgFramePaint");
  627.    _pfnCtl3dAutoSubclass = (PFNAUTOSUBCLASS)GetProcAddress(_hinstDll,"Ctl3dAutoSubclass");
  628.    _pfnCtl3dRegister = (PFNREGISTER)GetProcAddress(_hinstDll,"Ctl3dRegister");
  629.    _pfnCtl3dUnregister = (PFNUNREGISTER)GetProcAddress(_hinstDll,"Ctl3dUnregister");
  630.          
  631.  
  632. }
  633. /*******************************************************************
  634.      Function    : SAFCtl3dV2::InitPrivate
  635.  
  636.      Description :
  637.  
  638.      Parameters  : 
  639.  
  640.      Return Value: void
  641.  
  642.      Comments    :
  643. ********************************************************************/
  644.  
  645. void SAFCtl3dV2::InitPrivate()
  646. {                        
  647.    _bInit = FALSE;       
  648.    _hinstDll = NULL;     
  649.    _hinstSelfAuto = NULL;
  650.    _sError = CCTL3D_OK;      
  651. }
  652. /*******************************************************************
  653.      Function    : SAFCtl3dV2::AutoAuto
  654.  
  655.      Description :
  656.  
  657.      Parameters  : 
  658.  
  659.      Return Value: void
  660.  
  661.      Comments    :
  662. ********************************************************************/
  663.  
  664. void SAFCtl3dV2::AutoAuto()
  665. {                       
  666.    HINSTANCE hInst = GetInstance();
  667.    
  668.    if (!hInst)
  669.    {    
  670.       return;
  671.    }
  672.              
  673.    if (Ctl3dRegister(hInst))
  674.       if (Ctl3dAutoSubclass(hInst))
  675.          _hinstSelfAuto = hInst;
  676.  
  677. }
  678.                             
  679. /*******************************************************************
  680.      Function    : SAFCtl3dV2::GetInstance
  681.  
  682.      Description :
  683.  
  684.      Parameters  : 
  685.  
  686.      Return Value: HINSTANCE
  687.  
  688.      Comments    :
  689. ********************************************************************/
  690.  
  691. HINSTANCE SAFCtl3dV2::GetInstance()
  692. {
  693.    //use ToolHelp.dll to find hinstance of the current task
  694.    HTASK hTaskCur = NULL;
  695.    TASKENTRY te;
  696.    memset(&te, 0x00, sizeof(TASKENTRY) );
  697.    te.dwSize = sizeof(TASKENTRY);
  698.    OFSTRUCT of;
  699.    char szToolHelp[] = "toolhelp.dll";                                     
  700.    PFNTASKFINDHANDLE pfnTaskFindHandle = NULL;
  701.    HINSTANCE hinstToolHelp = NULL;
  702.    HINSTANCE hinstReturn = NULL;
  703.                          
  704.    hTaskCur = GetCurrentTask();                         
  705.    
  706.    if (!hTaskCur)
  707.       return NULL;
  708.       
  709.       
  710.    HFILE hfToolHelp = OpenFile( szToolHelp,
  711.                                 &of, 
  712.                                 OF_EXIST | OF_SEARCH);
  713.        
  714.    //don't call load library if it is not there                                   
  715.    if (hfToolHelp != HFILE_ERROR)
  716.    {
  717.       if (hinstToolHelp = LoadLibrary(szToolHelp))
  718.          pfnTaskFindHandle = (PFNTASKFINDHANDLE)GetProcAddress( hinstToolHelp, 
  719.                                                               "TaskFindHandle");                                                      
  720.    }
  721.                                                                     
  722.    if (pfnTaskFindHandle)
  723.    {
  724.       if (pfnTaskFindHandle(&te, hTaskCur))
  725.          hinstReturn = te.hInst;
  726.             
  727.    }                                                                    
  728.       
  729.    if (hinstToolHelp)
  730.       FreeLibrary(hinstToolHelp);
  731.       
  732.    return hinstReturn;               
  733.          
  734. }
  735.  
  736. /*******************************************************************
  737.      Function    : SAFCtl3dV2::DoCopy
  738.  
  739.      Description :
  740.  
  741.      Parameters  : 
  742.  
  743.      Return Value: LONG
  744.  
  745.      Comments    :
  746. ********************************************************************/
  747.  
  748. LONG SAFCtl3dV2::DoCopy(HFILE hfSrc, HFILE hfDest)
  749. {
  750.    //use LZExpand.dll to find hinstance of the current task
  751.    OFSTRUCT of;
  752.    char szLZExpand[] = "LZExpand.dll";                                     
  753.    PFNLZCOPY pfnLzCopy = NULL;
  754.    HINSTANCE hinstLZExpand = NULL;
  755.    LONG lReturn = -100;
  756.                          
  757.    
  758.    HFILE hfLZExpand = OpenFile( szLZExpand,
  759.                                 &of, 
  760.                                 OF_EXIST | OF_SEARCH);
  761.        
  762.    //don't call load library if it is not there                                   
  763.    if (hfLZExpand != HFILE_ERROR)
  764.    {
  765.       if (hinstLZExpand = LoadLibrary(szLZExpand))
  766.          pfnLzCopy = (PFNLZCOPY)GetProcAddress( hinstLZExpand, 
  767.                                                "LZCopy");                                                      
  768.    }
  769.                                                                     
  770.    if (pfnLzCopy)
  771.    {
  772.       lReturn = pfnLzCopy(hfSrc, hfDest);
  773.    }                                                                    
  774.       
  775.    if (hinstLZExpand)
  776.       FreeLibrary(hinstLZExpand);
  777.       
  778.    return lReturn;               
  779.          
  780.  
  781.  
  782. }
  783.