Win9X系统下如何获取主机的所有显卡型号和显卡显存大小?

CYBERDREAM 2004-07-14 01:57:39
在Win9X系统中怎样才能获取所有的显卡类型 以及显存大小啊? 通过注册表或是通过API或是通过DirectDraw都可以.

通过IdirectDraw接口的GetCaps()方法对有的显卡不能取出显存的大小值 ,所以询问有没有其它的准确可靠的方法?
...全文
221 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
CYBERDREAM 2004-07-15
  • 打赏
  • 举报
回复
to taianmonkey() :
該方法試過,對有的顯卡就取不出來顯存大小, 函數執行成功,但返回的顯存是0
dream989 2004-07-14
  • 打赏
  • 举报
回复
mark
lanstar200 2004-07-14
  • 打赏
  • 举报
回复
MARK
taianmonkey 2004-07-14
  • 打赏
  • 举报
回复
获取显存大小:

#include <ddraw.h>

#pragma comment(lib, "guids.lib")

LPDIRECTDRAW2 lpdd;
HRESULT ddrval;

CoInitialize(NULL);

ddrval = CoCreateInstance(CLSID_DirectDraw,
NULL, CLSCTX_ALL, IID_IDirectDraw2, (void**)&lpdd);


if(!FAILED(ddrval))
{
ddrval = IDirectDraw2_Initialize(lpdd, NULL);
}

DDCAPS ddcaps;

ddcaps.dwSize = sizeof DDCAPS;
lpdd->GetCaps(&ddcaps, NULL);

lpdd->Release();

DWORD dwMem = ddcaps.dwVidMemTotal;

int iMem = dwMem/1024/1024;

CString strMem;
strMem.Format(_T("display memory is %d MB"),iMem);

AfxMessageBox(strMem);

CoUninitialize();
CYBERDREAM 2004-07-14
  • 打赏
  • 举报
回复
To gracezhu(eutom) :
Win9x系統對WMI好像支持的還很不好啊 ,還需要安裝一個WMI的安裝包才可以使用WMI功能吧?
CYBERDREAM 2004-07-14
  • 打赏
  • 举报
回复
謝謝上面的各位, 代碼我之前就看過,也試過,在Win9x系統可以嗎?呵呵 ,至少是不可能讀取出顯存信息的
Kudeet 2004-07-14
  • 打赏
  • 举报
回复
作者:xstring (麻雀)

问:如何列出系统中安装的显卡。
答:
以下方法是通过注册表来得到的。每个显卡会安装一个kernel service,这些服务都会在Video这个Group内,然后枚举每个service下面的设备加在一起就可以了。
代码如下:

/*
* enum-vc.cpp - 列出系统中的显卡
*
* 作者: xstring@csdn
* 日期: 2004.04.17
*
* 说明:
* 如果你要得到每个显卡的更多硬件信息, 请自己查看程序中所涉及到
* 的注册表位置。
*/

#define _WIN32_WINNT 0x400
#define STRICT
#define WIN32_LEAN_AND_MEAN

#include <stdio.h>
#include <tchar.h>
#include <locale.h>
#include <windows.h>

#pragma warning (disable : 4786)
#include <list>
#include <string>

#pragma comment (lib, "advapi32.lib")
#pragma comment (lib, "user32.lib")

#ifdef _UNICODE
typedef std::wstring string;
#else
typedef std::string string;
#endif

void print_msg (LPCTSTR api, DWORD error)
{
LPTSTR str = NULL;
FormatMessage (FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
NULL, error, 0, (LPTSTR)&str, 0, 0);
_tprintf (TEXT ("%s 调用失败,错误代码: %u\n %s\n"),
api, error, str);
LocalFree (str);
};

#define CHECK_ERROR(apiname) if (error != ERROR_SUCCESS) { api = TEXT (apiname); goto failed; }


int main (void)
{
HKEY keyServ = NULL;
HKEY keyEnum = NULL;
HKEY key = NULL;
HKEY key2 = NULL;
DWORD error = 0;
LPCTSTR api = NULL;
DWORD type, count, size, i, iServ;
std::list <string> save;

setlocale (LC_ALL, ".ACP");

error = RegOpenKeyEx (HKEY_LOCAL_MACHINE,
TEXT ("SYSTEM\\CurrentControlSet\\Services"),
0, KEY_READ, &keyServ);

CHECK_ERROR ("RegOpenKeyEx");

error = RegOpenKeyEx (HKEY_LOCAL_MACHINE,
TEXT ("SYSTEM\\CurrentControlSet\\Enum"),
0, KEY_READ, &keyEnum);

CHECK_ERROR ("RegOpenKeyEx");

i = 0;
for (iServ=0;;++iServ)
{
TCHAR name [0x200];
size = 0x200;
error = RegEnumKeyEx (keyServ, iServ, name, &size,
NULL, NULL, NULL, NULL);

if (error == ERROR_NO_MORE_ITEMS)
break;

CHECK_ERROR ("RegEnumKeyEx");

error = RegOpenKeyEx (keyServ, name, 0, KEY_READ, &key);

CHECK_ERROR ("RegOpenKeyEx");

size = 0x200;
error = RegQueryValueEx (key, TEXT ("Group"),
0, &type, (LPBYTE)name, &size);

if (error == ERROR_FILE_NOT_FOUND)
{ // 键不存在
RegCloseKey (key);
continue;
};

CHECK_ERROR ("RegQueryValueEx");

if (_tcscmp (TEXT ("Video"), name) != 0)
{ // 不是显卡的内核驱动
RegCloseKey (key);
continue;
};

error = RegOpenKeyEx (key, TEXT ("Enum"),
0, KEY_READ, &key2);

CHECK_ERROR ("RegOpenKeyEx");
RegCloseKey (key);
key = key2;

size = sizeof (count);
error = RegQueryValueEx (key, TEXT ("Count"),
0, &type, (LPBYTE)&count, &size);

CHECK_ERROR ("RegQueryValueEx");


for (i=0;i<count;++i)
{
TCHAR sz [0x200];
TCHAR name [0x40];

wsprintf (name, TEXT ("%d"), i);
size = sizeof (sz);
error = RegQueryValueEx (key, name,
0, &type, (LPBYTE)sz, &size);

CHECK_ERROR ("RegQueryValueEx");

error = RegOpenKeyEx (keyEnum, sz,
0, KEY_READ, &key2);

CHECK_ERROR ("RegOpenKeyEx");

size = sizeof (sz);
error = RegQueryValueEx (key2, TEXT ("FriendlyName"),
0, &type, (LPBYTE)sz, &size);

if (error == ERROR_FILE_NOT_FOUND)
{
size = sizeof (sz);
error = RegQueryValueEx (key2, TEXT ("DeviceDesc"),
0, &type, (LPBYTE)sz, &size);
};
CHECK_ERROR ("RegQueryValueEx");

save.push_back (sz);
RegCloseKey (key2);
key2 = NULL;
};
RegCloseKey (key);
key = NULL;
};

RegCloseKey (keyEnum);
RegCloseKey (keyServ);

if (true)
{
std::list <string>::iterator it, end;
it = save.begin ();
end = save.end ();

_tprintf (TEXT("您的系统上共有 %u 块显卡: \n\n"), save.size ());
for (i=0;it!=end;++it)
_tprintf (TEXT (" 显卡 %d: - %s\n"), i++, it->c_str ());
}
return 0;

failed:
if (keyServ)
RegCloseKey (keyServ);
if (keyEnum)
RegCloseKey (keyEnum);
if (key)
RegCloseKey (key);
if (key2)
RegCloseKey (key2);
print_msg (api, error);
return error;
};

在我的系统上运行结果如下:

您的系统上共有 1 块显卡:

显卡 0: - NVIDIA GeForce4 Ti 4200 with AGP8X
gracezhu 2004-07-14
  • 打赏
  • 举报
回复
http://community.csdn.net/Expert/FAQ/FAQ_Index.asp?id=188129

2,640

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 硬件/系统
社区管理员
  • 硬件/系统社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧