用程序取得CPU信息

本文介绍了如何通过CPUID汇编指令获取CPU的制造商、型号、是否支持MMX等信息,包括Intel、Cyrix和AMD的CPU识别方法。通过示例代码展示了在C++Builder中如何实现获取CPU信息,并提供了在Windows环境下利用Enter键切换焦点的技术。
摘要由CSDN通过智能技术生成

很 多 软 件 可 以 判 断 所 运 行 的 电 脑 类 型 而 自 动 做 不同 的 处 理。 如PhotoShop 5 可 以 探
      测CPU 是 否 有MMX 支 持 而 调 用 不同 的 处 理 函 数,《 金 山 词 霸》 发 现 有MMX 支 持 会 产 生 半 透 明的
      翻 译 提 示, 很 多 软 件 可 以 区 分Intel,Cyrix,AMD 的CPU...

      ---- 现 在, 且 让 我 细 细 道 来 如 何 让 你 在 自 己 的 程 序 中 取得CPU 信 息。

      ---- 主 要 可 利 用 CPUID 汇 编 指 令( 机 器 码:0FH A2H, 如 果 你 的编 译 器 不 支 持CPUID 指 令,
      只 有 emit 机 器 码 了) 该 指 令 可 以 被如 下CPU 识 别

      Intel 486 以 上 的CPU,

      Cyrix M1 以 上 的CPU,

      AMD Am486 以 上 的CPU


      (1) 取CPU OEM 字 符 串, 判 断CPU 厂 商

      先 让EAX=0, 再 调 用CPUID

      Inel 的CPU 将 返 回:

      EBX:756E6547H 'Genu'

      EDX:49656E69H 'ineI'

      ECX:6C65746EH 'ntel'

      EBX,EDX,ECX 将 连 成"GenuineIntel", 真 正 的Intel。

      Cyrix 的CPU 将 返 回:

      EBX:43797269H

      EDX:78496E73H

      ECX:74656164H

      "CyrixInstead","Cyrix 来 代 替"。

      AMD 的CPU 将 返 回:

      EBX:41757468H

      EDX:656E7469H

      ECX:63414D44H

      "AuthenticAMD", 可 信 的AMD。


      ---- 在Windows98 中, 用 右 键 单 击" 我 的 电 脑", 选 择" 属 性- 常规" 在 计 算 机 描 述 处 就 可 看
      见CPU OEM 字 符 串。

      (2)CPU 到 底 是 几86, 是 否 支 持MMX

      先 让EAX=1, 再 调 用CPUID

      EAX 的 8 到11 位 就 表 明 是 几86

      3 - 386

      4 - i486

      5 - Pentium

      6 - Pentium Pro Pentium II

      2 - Dual Processors

      EDX 的 第0 位: 有 无FPU

      EDX 的 第23 位:CPU 是 否 支 持IA MMX, 很 重 要 啊!如 果 你 想 用 那57 条 新 增 的 指 令, 先 检 查 这
      一 位 吧, 否 则 就等 着 看Windows 的" 该 程 序 执 行 了 非 法 指 令, 将 被 关 闭" 吧。

      (3) 专 门 检 测 是 否P6 架 构

      先 让EAX=1, 再 调 用CPUID

      如 果AL=1, 就 是Pentium Pro 或Pentium II

      (4) 专 门 检 测AMD 的CPU 信 息

      先 让EAX=80000001H, 再 调 用CPUID

      如 果EAX=51H, 是AMD K5

      如 果EAX=66H, 是K6

      EDX 第0 位: 是 否 有FPU

      EDX 第23 位,CPU 是 否 支 持MMX,

      程 序 如 下: 是C++Builder 的 控 制 台 程 序, 可 以 给 出 你 的" 心" 的 信 息。 如 果 把 这 个 技 术 用 于
      DLL 中, 便 可 以 使VB 程 序 也 知道" 心" 的 信 息。

      file://------CPUID Instruction Demo Program------------
      #include < conio.h >
      #include < iostream.h >
      #pragma hdrstop
      file://------------------------------------------------

      #pragma inline
      #pragma argsused

      int main(int argc, char **argv)
      {
      char OEMString[13];
      int iEAXValue,iEBXValue,iECXValue,iEDXValue;

      _asm {
      mov eax,0
      cpuid
      mov DWORD PTR OEMString,ebx
      mov DWORD PTR OEMString+4,edx
      mov DWORD PTR OEMString+8,ecx
      mov BYTE PTR OEMString+12,0
      }

      cout< < "This CPU 's OEM String is:"< < OEMString< < endl;

      _asm {
      mov eax,1
      cpuid
      mov iEAXValue,eax
      mov iEBXValue,ebx
      mov iECXValue,ecx
      mov iEDXValue,edx
      }

      if(iEDXValue&0x800000)
      cout < < "This is MMX CPU"< < endl;
      else
      cout < < "None MMX Support."< < endl;

      int iCPUFamily=(0xf00 & iEAXValue) > >8;

      cout < < "CPU Family is:"< < iCPUFamily< < endl;

      _asm{
      mov eax,2
      CPUID
      }

      if(_AL==1)
      cout < < "Pentium Pro or Pentium II Found";

      getch();

      return 0;

      }
    ShowMessage("Could not MakeCurrent");

请问如何用ENTER键进行焦点转移,?

 1  在Windows 环 境 下, 要 使 一 个 控 件 取 得 焦 点, 可 在 该 控 件 上 用 鼠 标 单 击 一 下,
  或 按Tab 键 将 焦 点 移 至 该 控 件 上。 这 种 控 制 焦 点 切 换 的 方 法 有 时 不 符 合 用 户
  的 习 惯。 就 图 一 而 言, 用 户 就 希 望 用Enter 键, 控 制 焦 点 由Edit1 切 换 到Edit2。
  要 实 现 这 样 的 功 能 需 借 助WinAPI 函 数SendMessage 来 完 成。 方 法 是:
  先 设Form1 的KeyPreview 属 性 为true, 然 后 在Form1 的OnKeyPress 事 件 中 加 入 如 下 的 代 码。
 这 样, 用 户 就 可 以 通 过 按Enter, 键 控 制 焦 点 按 定 义 好 的Taborder 顺 序 来 移 动 了 !
 void __fastcall TForm1::
    FormKeyPress(TObject *Sender, char &Key)
   {
     if(Key==VK_RETURN)
     {
         SendMessage(this- >Handle,WM_NEXTDLGCTL,0,0);
        Key=0;
     }
 }

   2  在edit1的OnKeyPress(event)中加入
          if(Key==VK_RETURN)Edit3->SetFocus();

网络蚂蚁的窗口消失??
 Timer->Intrval=10;
 void __fastcall TForm1::Timer1Timer(TObject *Sender)
 {
 Form1->Width-=20;
 Form1->Height-=20;
 if(Form1->Width==108&&Form1->Height==27)
  {Form1->Close ();}
 Form1->Top+=10;
 Form1->Left+=10;}


(2)TDateTime  t1;
Form1->Caption="今天是:"+DateToStr(Date())+"现在时间是:"+TimeToStr(Time());
(3) AnsiString S;
        S = "";
        if (SelectDirectory("Select Directory", "", S))
                SetPath(S);
(4) AnsiString S;
    InputQuery("标题","提示",s);

窗口背景
 public:
  Graphics::TBitmap *bitmap;
file://---------------------------------
 void __fastcall TForm1::FormCreate(TObject *Sender)
 {
 bitmap=new Graphics::TBitmap;
 bitmap->LoadFromFile("Arc.bmp");
 }
file://---------------------------------------------------------------------------

 void __fastcall TForm1::FormPaint(TObject *Sender)
 {
 int x,y;
 y=0;
 while(y<Height)
 {x=0;
   while(x<Width)
   {Canvas->Draw (x,y,bitmap);
     x=x+bitmap->Width ;
     }
     y=y+bitmap->Height ;
     }       
 }

 

如何把JPG文件转成BMP文件???
 先用TImage控件 Image1->Picture->LoadFromFile(你的Jpeg文件)
 然后
 Graphics::TBitmap*tmp=new Graphics::TBitmap();
 tmp->Assign(Image1->Picture->Graphic);
 tmp->SaveToFile(FileName);


文件读取写入
 int i=0;
 char sn[]="123";
    if(!FileExists("aaa.txt"))
    {
        i=FileCreate("aaa.txt");
        FileWrite(i,sn,strlen(sn));
        FileClose(i); ShowMessage("ok");}

 {char buf[3];
       AnsiString str;
        int i;
       i=FileOpen("d://aaa.txt",fmOpenReadWrite);
      

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值