Win31J レスキューキット
--- Sorry, Home Page in English is under construction.

FAQ集

* コンベンショナルメモリーの空き容量の計算方法


* 「Win31Jレスキューキット」内部で、コンベンショナルメモリーの空き容量を計算しているコードは おおよそ以下の通りです。

下記のコードを組み込んだフリーソフトがあります。
* コンベンショナルメモリー残量計 Ver 1.5

空き容量を求めるには、他にウィンドウズの内部データにアクセス、メモリーチェインをたどることにより直接計算する方法と、ToolHelp を使用して同様に求める方法があるが、下記の方法の方が次の点で優位である。

  1. ウィンドウズ内部データにアクセスする方法は、Undocumented な情報を利用しなければならず、また、エンハンストモードとスタンダードモードで処理を変えなければならない。
  2. メモリーチェインをたどる間は割り込み禁止にしなければ動作の保証が得られない。これは、通信等でデータ抜けを引き起こす。
  3. ToolHelp を使用してメモリーチェインをたどる方法は、割り付けられたメモリーブロックが多くなるとスピード的に不利である。

    
    /* 現在のコンベンショナルメモリーの空き容量を計算して返す。
       単位はバイト。ただし、512バイト以下の誤差あり。
     */
    DWORD GetFreeDosMemSize(void)
    {	UINT uSel, uSelLast = 0;
    	DWORD dwFreeSize = 0, cbAllocNow = 65536L * 2;
    
    	while (cbAllocNow >= 512) {
    		if ((uSel = LOWORD(GlobalDosAlloc(cbAllocNow)))!=0) {
    			dwFreeSize += cbAllocNow;
    			GlobalLock(uSel);
    			*((LPUINT) MAKELP(uSel, 0)) = uSelLast;
    			uSelLast = uSel;
    		}
    		else cbAllocNow = (cbAllocNow * 3) / 4;
    	}
    	while (uSelLast != 0) {
    		uSel = *(LPUINT) MAKELP(uSelLast, 0);
    		GlobalUnlock(uSelLast);
    		GlobalDosFree(uSelLast);
    		uSelLast = uSel;
    	}
    	return dwFreeSize;
    }
    

    以上。


* Win31J レスキューキット FAQ集の目次

Copyright (c) 1994-1996 CSD,inc. and shoda T.

お問い合わせは: shoda@csdinc.co.jp