如何在win98 se下得到显存大小,用mitic组件得不到。

解决方案 »

  1.   

    http://blog.csdn.net/Pregunta/archive/2006/08/24/1111702.aspx
      

  2.   

    下载一个MiTeC System Information Component Suite,最新版是10.2.0,进行安装,
    安装完毕后新建一个FORM,然后拖一个其中的组件MiTeC_Display到FORM上,然后再在程序段处写
    MiTeC_Display1.RefreshData;
    showmessage(floattostr(MiTeC_Display1.Memory/1024/1024)+' MB');
      

  3.   

    当然也可以用API
    GetAvailableVidMem
    GetAvailableVidMem,该函数可以获得所有可用的显存容量值,和当前可以为某种指定类型的页面所用的空余显存容量值。
      

  4.   

    有MiTeC System Information Component Suite的源码吗。
      

  5.   

    它不是开源的...GetAvailableVidMem一样可以的不过哪个控件还可以算显卡的其它一些参数,比较强
      

  6.   

    GetAvailableVidMem,我用msdn查不到这个api.
      

  7.   

    IDirectDraw7->GetAvailableVidMem
      

  8.   

    DirectDraw原理与API参考一书上有
      

  9.   

    DirectX是基于COM的,因此学习它还是很有规律的。最近有些学习感悟,故写出来。一个COM对象实际上是一个或一套实现了大量接口的C++类。而一个接口是指一套函数。COM规范要求所有的接口都必须从一个名为IUnknown的特殊接口那里继承而来,对于IUnknown接口就不讨论了,因为书上讲的很详细。要想调用某接口中的方法,必须先获得该接口对象的指针,一个对象可以有一个或多个接口。(1)COM规定为每个接口分配一个全球唯一标识(即GUID),要想获得某个接口的指针,必须通过该接口的GUID. 下面是DirectDraw组件来说,其它组件与此雷同。DriectdDaw组件中主要包含一下五个接口:1.   IUnknown2.   IDirectDraw3.   IDirectDrawSurface4.   IDirectDrawPalette5.   IDirectDrawClipper这个对象从以上所有的接口继承而来,而此时DLL就是容器类,它包含了接口的全部实现,这样只要获得其中某一个接口,就可以获得对象中其它的任意接口。所以要想使用COM对象中的接口,必须先要得到一个COM对象的接口的指针,再由这个接口指针得到别的接口。这样COM对象中的所有接口我们就都可以使用了。先来看看DirectDraw的使用示例:IDirectDraw7 *lpdd;if (FAILED(DirectDrawCreateEx(NULL, (void **)&lpdd, IID_IDirectDraw7, NULL)))return(0);//先得到IDirectDraw7接口对象的指针//为了简化,指显示得到其它接口的代码,每个接口的具体操作略  if (FAILED(lpdd->CreateSurface(&ddsd, &lpddsprimary, NULL)))   return(0);//通过IDirectDraw7的接口指针,得到IDirectDrawSurface的接口指针 if (FAILED(lpdd->CreatePalette(DDPCAPS_8BIT | DDPCAPS_ALLOW256 |                                 DDPCAPS_INITIALIZE,                                 palette,&lpddpal, NULL)))return(0);//通过IDirectDraw7的接口指针,得到IDirectDrawPalette的接口指针//虽然不能查看CreateSurface和CreatePalette函数的实现代码,但容易想到它应该调用的是// QueryInterface (IID riid, void far * ppvObj)函数来得到的其它接口的指针看了下面的示例,很容易理解接口的一些特点:1.COM接口是从IUNKNOWN接口继承而来的2.接口中封装了一套纯虚函数既然接口中封装的只是纯虚函数,那么函数的实现在哪呢,当然是在它的继承类中。interface IDirectDraw7: public IUnknown 
    {
        /*** IUnknown methods ***/virtual HRESULT __stdcall QueryInterface (IID riid, void far * ppvObj) =0;//STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID FAR * ppvObj) PURE;virtual ULONG __stdcall AddRef () =0;// STDMETHOD_(ULONG,AddRef) (THIS)  PURE;virtual ULONG __stdcall Release () =0;//  STDMETHOD_(ULONG,Release) (THIS) PURE;    /*** IDirectDraw methods ***///以下同上,只是进行了一下封装,实际上还是一套纯虚函数
        STDMETHOD(Compact)(THIS) PURE;
        STDMETHOD(CreateClipper)(THIS_ DWORD, LPDIRECTDRAWCLIPPER FAR*, IUnknown FAR * ) PURE;
        STDMETHOD(CreatePalette)(THIS_ DWORD, LPPALETTEENTRY, LPDIRECTDRAWPALETTE FAR*, IUnknown FAR * ) PURE;
        STDMETHOD(CreateSurface)(THIS_  LPDDSURFACEDESC2, LPDIRECTDRAWSURFACE7 FAR *, IUnknown FAR *) PURE;
        STDMETHOD(DuplicateSurface)( THIS_ LPDIRECTDRAWSURFACE7, LPDIRECTDRAWSURFACE7 FAR * ) PURE;
        STDMETHOD(EnumDisplayModes)( THIS_ DWORD, LPDDSURFACEDESC2, LPVOID, LPDDENUMMODESCALLBACK2 ) PURE;
        STDMETHOD(EnumSurfaces)(THIS_ DWORD, LPDDSURFACEDESC2, LPVOID,LPDDENUMSURFACESCALLBACK7 ) PURE;
        STDMETHOD(FlipToGDISurface)(THIS) PURE;
        STDMETHOD(GetCaps)( THIS_ LPDDCAPS, LPDDCAPS) PURE;
        STDMETHOD(GetDisplayMode)( THIS_ LPDDSURFACEDESC2) PURE;
        STDMETHOD(GetFourCCCodes)(THIS_  LPDWORD, LPDWORD ) PURE;
        STDMETHOD(GetGDISurface)(THIS_ LPDIRECTDRAWSURFACE7 FAR *) PURE;
        STDMETHOD(GetMonitorFrequency)(THIS_ LPDWORD) PURE;
        STDMETHOD(GetScanLine)(THIS_ LPDWORD) PURE;
        STDMETHOD(GetVerticalBlankStatus)(THIS_ LPBOOL ) PURE;
        STDMETHOD(Initialize)(THIS_ GUID FAR *) PURE;
        STDMETHOD(RestoreDisplayMode)(THIS) PURE;
        STDMETHOD(SetCooperativeLevel)(THIS_ HWND, DWORD) PURE;
        STDMETHOD(SetDisplayMode)(THIS_ DWORD, DWORD,DWORD, DWORD, DWORD) PURE;
        STDMETHOD(WaitForVerticalBlank)(THIS_ DWORD, HANDLE ) PURE;
        /*** Added in the v2 interface ***/
        STDMETHOD(GetAvailableVidMem)(THIS_ LPDDSCAPS2, LPDWORD, LPDWORD) PURE;
        /*** Added in the V4 Interface ***/
        STDMETHOD(GetSurfaceFromDC) (THIS_ HDC, LPDIRECTDRAWSURFACE7 *) PURE;
        STDMETHOD(RestoreAllSurfaces)(THIS) PURE;
        STDMETHOD(TestCooperativeLevel)(THIS) PURE;
        STDMETHOD(GetDeviceIdentifier)(THIS_ LPDDDEVICEIDENTIFIER2, DWORD ) PURE;
        STDMETHOD(StartModeTest)(THIS_ LPSIZE, DWORD, DWORD ) PURE;
        STDMETHOD(EvaluateMode)(THIS_ DWORD, DWORD * ) PURE;
    };有上面这个接口定义可以发现,接口中定义的方法都是纯虚函数,但正真的实现在那里呢?上面(1)所提到的对象又在那里呢?DirectX依靠硬件抽象层(HAL)解决了这些疑问。它使得我们的编程于设备无关。(本来嘛,不同的硬件厂商,提供的同一个操作(比如光栅化),可能实现的方式不同,访问的方式也不同,这就使得如果你想让自己的程序在某个特定的设备上运行,必须满足它的规范,可想而知,要想作一个在所有硬件设备上都能运行的应用程序是多么的困难)现在好了,DirectX提供了一套访问硬件的规范接口,就是上面所示的COM接口,当然,对不同的设备(比如不同的显卡),COM接口内的方法(函数)的实现不同,但我们不需要关心,这些实现也里所当然有生产硬件设备的厂商来提供。一般以设备驱动的一部分或是动态连接库的方式提供给你。这样我们的COM对象当然有可能就是动态连接库了。这样我们只要用COM接口中的方法就可以访问所有遵循这个接口约定的硬件设备(绝大多数都遵循),完成我们想要完成的功能。当然有些“便宜的”显卡可能实现的功能比较少(比如不支持矩阵乘法),我们可以用DirectX提供的函数查询,如果不支持,是不是就没办法了呢,别担心,direct早想好了,它为你提供了硬件仿真功能,用软件的方法实现了这些功能,这样,“便宜的”显卡也能运行你的应用程序了,但就是速度慢,但一份价钱一份货嘛,哪有便宜还想要好性能的,不能太贪心了,呵呵。