精华区 [关闭][返回]

当前位置:网易精华区>>讨论区精华>>编程开发>>C/C++>>技术精解:内存、进程、线程等>>VC里动态调用DLL的标准程序

主题:VC里动态调用DLL的标准程序
发信人: tjam()
整理人: wenbobo(2002-12-27 15:55:46), 站内信件
BOOL GetDiscFreeSpace(LPCTSTR lpszPath, DWORDLONG* pnFree)
{
   BOOL bRet = FALSE;

   // We need to determine whether GetDiskFreeSpaceEx is available by 
calling LoadLibrary
   // or LoadLibraryEx, to load Kernel32.DLL, and then calling the Get
ProcAddress to
   // obtain an address for GetDiskFreeSpaceEx.  If GetProcAddress fai
ls, or if
   // GetDiskFreeSpaceEx fails with the ERROR_CALL_NOT_IMPLEMENTED cod
e, we use the
   // GetDiskFreeSpace function instead.
   
   HINSTANCE hInstance = LoadLibrary("KERNEL32.DLL");

   if(hInstance) // If we got the library
   {

     typedef BOOL (FAR WINAPI *MYFARPROC)(LPCSTR,ULARGE_INTEGER*,ULARG
E_INTEGER*,ULARGE_INTEGER*);
     MYFARPROC lpfnDLLProc=NULL;
     //(LPCSTR,ULARGE_INTEGER*,ULARGE_INTEGER*,ULARGE_INTEGER*);
     //= NULL;

     lpfnDLLProc = (MYFARPROC)GetProcAddress(hInstance, "GetDiskFreeSp
aceExA");

     if(lpfnDLLProc) // If we got an address to the function
     {
ULARGE_INTEGER nTotalBytes, nTotalFreeBytes, nTotalAvailable;

if((*lpfnDLLProc)(lpszPath, &nTotalAvailable, &nTotalBytes, &nTotalFr
eeBytes))
//   if(GetDiskFreeSpaceEx(lpszPath, &nTotalAvailable, &nTotalBytes, &
nTotalFreeBytes))
  {
     *pnFree = nTotalAvailable.QuadPart;
     bRet = TRUE;
            }
      }

FreeLibrary(hInstance);
   }

if(!bRet) // We have to try and use GetDiskFreeSpace()
{
            ULONG secpercluster, bytespersec, nooffreeclusters, totaln
oofclusters;

   if(GetDiskFreeSpace(lpszPath, &secpercluster, &bytespersec,
      &nooffreeclusters, &totalnoofclusters))
   {
      *pnFree = (nooffreeclusters * secpercluster * bytespersec);
      bRet = TRUE;
    }
}

    return bRet;
}

--
春风再美也比不上你的笑,
没见过你的人不会明了!
-- 
 \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
^v^ Name:James Tan                ^o^
^v^ E-mail:[email protected]  ^o^

※ 来源:.月光软件站 http://www.moon-soft.com.[FROM: 202.101.14.205]

[关闭][返回]