C#调用delphi生成的dll获取CPU序列号(二)
来源:互联网 发布:70kg外设淘宝店 编辑:程序博客网 时间:2024/04/30 03:11
在前面一节,我们了解了如何用C#调用delphi生成的dll,在本节,我们就来用delphi来写一个获取CPU序列号的dll。代码里的注意事项在前一节都有提到,一定要注意。
1、新建delphi工程,工程的动态链接库代码如下:
library PcInfo;uses SysUtils, Classes, Windows;{$R *.res}type TCPUIDResult = packed record EAX: DWord; EBX: DWord; ECX: DWord; EDX: DWord; end; TCPUInfo =packed record Name: string[48]; Brand: Word; APIC: DWORD; Vendor: string[12]; Frequency: Real; Family: integer; Model: integer; Stepping: integer; EFamily: integer; EModel: integer; EStepping: integer; MMX: Boolean; MMXPlus: Boolean; AMD3DNow: Boolean; AMD3DNowPlus: Boolean; SSE: Boolean; SSE2: Boolean; IA64: Boolean; X86_64: Boolean; ID:string; end;//获取cpu序列号function CPUID(EAX: DWord): TCPUIDResult;var rEAX, rEBX, rECX, rEDX: DWord;begin asm push EAX push EBX push ECX push EDX mov EAX,EAX db $0F,$A2 mov rEAX,EAX mov rEBX,EBX mov rECX,ECX mov rEDX,EDX pop EDX pop ECX pop EBX pop EAX end; Result.EAX := rEAX; Result.EBX := rEBX; Result.ECX := rECX; Result.EDX := rEDX;end;function GetCPUInfo: TCPUInfo;type TRegChar = array[0..3] of char;var lvCPUID : TCPUIDResult; I : Integer;begin lvCPUID := CPUID(0); result.ID:=Format('%x-%x-%x-%x',[lvCPUID.EAX,lvCPUID.EBX,lvCPUID.ECX,lvCPUID.EDX]); Result.Vendor := TRegChar(lvCPUID.EBX) + TRegChar(lvCPUID.EDX) + TRegChar(lvCPUID.ECX); lvCPUID := CPUID(1); result.ID:=result.ID + Format('-%x-%x-%x',[lvCPUID.EAX,lvCPUID.ECX,lvCPUID.EDX]); Result.Family := (lvCPUID.EAX and $F00) shr 8; Result.Model := (lvCPUID.EAX and $78) shr 4; Result.Stepping := (lvCPUID.EAX and $F); Result.EFamily := (lvCPUID.EAX and $7800000) shr 20; Result.EModel := (lvCPUID.EAX and $78000) shr 16; Result.EStepping := (lvCPUID.EAX and $F); Result.APIC := (lvCPUID.EBX and $1FE00000) shr 23; Result.Brand := lvCPUID.EBX and $7F; Result.MMX := (lvCPUID.EDX and $800000) = $800000; Result.SSE := (lvCPUID.EDX and $2000000) = $2000000; Result.SSE2 := (lvCPUID.EDX and $4000000) = $4000000; Result.IA64 := (lvCPUID.EDX and $40000000) = $40000000; lvCPUID := CPUID($80000001); Result.MMXPlus := (lvCPUID.EDX and $800000) = $800000; Result.AMD3DNow := (lvCPUID.EDX and $10000000) = $10000000; Result.AMD3DNowPlus := (lvCPUID.EDX and $8000000) = $8000000; Result.X86_64 := (lvCPUID.EDX and $40000000) = $40000000; if (Result.Vendor = 'GenuineIntel') and ((Result.Family <> 15) or (Result.EFamily <> 0)) then Result.Name := Result.Vendor + ' Processor' else begin Result.Name := ''; for i := 2 to 4 do begin lvCPUID := CPUID($80000000 + i); Result.Name := Result.Name + TRegChar(lvCPUID.EAX) + TRegChar(lvCPUID.EBX) + TRegChar(lvCPUID.ECX) + TRegChar(lvCPUID.EDX); end; Result.Name := Trim(Result.Name); end;end;procedure GetCpuNumber(p:PChar);stdcall;var cpu: TCpuInfo; cpuid:PChar;begin cpu :=GetCpuInfo; cpuid:=PChar(cpu.ID); //类型cpu包括了序列号、名称、类型等信息,在这里只返回序列号 StrCopy(p,cpuid);end; exports GetCpuNumber;beginend.
2、编译、生成PcInfo.dll,并把dll文件复制到C#项目的bin\debug目录下。
dll下载地址http://download.csdn.net/detail/sunny906/8150053
3、在C#项目里引用PcInfo.dll,代码如下:
// 引用dll [DllImport("PcInfo.dll")] public static extern void GetCpuNumber(StringBuilder cpuID); //调用dll StringBuilder value = new StringBuilder(256); //注意,value参数对应的是pchar类型的指针变量,所以此处一定要指定参数的大小 GetCpuNumber(value); Console.WriteLine(value.ToString());
4、为了区分pcinfo返回的CPU序列号和Win32_Processor获取的CPU序列号有何不同,我们也写出调用WMI获取CPU序列号的方法,代码如下:
string cpuID = string.Empty; ManagementClass mc = new ManagementClass("Win32_Processor"); ManagementObjectCollection moc = mc.GetInstances(); foreach (ManagementObject mo in moc) { cpuID = mo.Properties["ProcessorId"].Value.ToString(); break; } Console.WriteLine(cpuID);
5、运行C#程序,看看这两种方法输出的结果吧,结果是不是很不一样呢,个人更偏向于调用汇编所取得的值。
0 0
- C#调用delphi生成的dll获取CPU序列号(二)
- C#调用delphi生成的dll获取CPU序列号(一)
- C#调用C++生成的dll获取CPU序列号(二)
- C#调用C++生成的dll获取CPU序列号(一)
- 如何用 DELPHI 获取 CPU 的序列号
- C# 获取CPU序列号
- java调用dll获取硬盘和cpu序列号
- Delphi 获取 Cpu 序列号单元
- C# 调用delphi生成Dll的相关问题
- C#生成DLL以及Delphi调用
- C#获取CPU序列号机器码并生成注册码
- C# 获取机器的硬件信息(CPU ID序列号, 主板信息,硬盘序列号,系统信息)
- C# 获取机器的硬件信息(CPU ID序列号, 主板信息,硬盘序列号,系统信息)
- C#获取磁盘序列号和cpu序列号
- DELPHI读取CPU的序列号
- 在C#调用C++的DLL简析(二)—— 生成托管dll
- delphi获取硬盘序列号的dll代码,支持win7
- delphi获取硬盘序列号的dll代码,支持win7
- 摘抄语句
- JAVA的StringBuffer类
- java 相关比较牛的博客
- 驱动开发之字符串操作
- router
- C#调用delphi生成的dll获取CPU序列号(二)
- 内存池
- 使用python调用azure api步骤文档
- redis+php安装,phpredis_api
- 绿色旅游体系:开发、经营、宣传和管理皆绿
- 几个简易编辑器
- MyEclipse2013 安装SVN插件
- c语言练习 4-0. 求符合给定条件的整数集(15)
- [技术] 用 DISM 命令修复 Windows 脱机系统