看看这样读注册表对不对?
- C/C++ code
char path[254]="SYSTEM\\CurrentControlSet\\Control\\Network\\{4D36E972-E325-11CE-BFC1-08002BE10318}\\";//这个是预写好的//pTemppip->AdapterName是从系统API读过来的网卡编号,类似是{C31B0A6A-3265-4E19-82A7-C9C6B26EEC6C} //pSourceip是从系统API读过来的网卡列表信息的首地址//iadapternum是网卡的个数//下面这段代码的意思是循环各个网卡的编号,然后从注册表读网卡的名字。匹配是否有网卡名叫NETA和NETB的。 pTemppip=pSourceip; for(int i=0;i<iadapternum;i++) { char TempPath[500]={0}; strcat(TempPath,path); strcat(TempPath,pTemppip->AdapterName); strcat(TempPath,"\\Connection"); int ret=RegOpenKeyEx(HKEY_LOCAL_MACHINE,(LPCTSTR)TempPath,0,KEY_READ,&hKey); if(ret==ERROR_SUCCESS) { BYTE name[MAX_PATH]={0}; DWORD bufLen=MAX_PATH; DWORD type_1=REG_SZ; ret=RegQueryValueEx(hKey,"Name",NULL,&type_1,(LPBYTE)name,&bufLen); if(ret==ERROR_SUCCESS) { if(strcmp((char *)name,"NETA")==0) { g_bHaveSnetA=TRUE; m_SnetAIndex=pTemppip->Index; } if(strcmp((char *)name,"NETB")==0) { g_bHaveSnetB=TRUE; m_SnetBIndex=pTemppip->Index; } } RegCloseKey( hKey ); } pTemppip=pTemppip->Next; if(pTemppip==NULL) break; }
但是实际结果是有些机器正常,有些机器会崩溃。
eax=00000002 ebx=7ffd8000 ecx=7c93005d edx=00000000 esi=0012fa2c edi=0012fb9c
eip=00403449 esp=0012fa2c ebp=0012fbd4 iopl=0 nv up ei pl nz na pe nc
cs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000 efl=00000202
*** WARNING: Unable to verify checksum for D:Node.exe
函数: Node!CCpuMemLoad__GetNetNameFromReg
0040342b 82 ???
0040342c 9c pushfd
0040342d 0100 add [eax],eax
0040342f 0089412c8bf4 add [ecx+0xf48b2c41],cl
00403435 8b4dec mov ecx,[ebp-0x14]
00403438 51 push ecx
00403439 ff1584c25f00 call dword ptr [Node!_imp__RegCloseKey (005fc284)]
0040343f 3bf4 cmp esi,esp
00403441 e84a1d0200 call Node!_chkesp (00425190)
00403446 8b55e0 mov edx,[ebp-0x20]
错误 ->00403449 8b02 mov eax,[edx] ds:0023:00000000=????????
0040344b 8945e0 mov [ebp-0x20],eax
0040344e c645fc00 mov byte ptr [ebp-0x4],0x0
00403452 8d4dcc lea ecx,[ebp-0x34]
00403455 e802db0700 call Node!CString__~CString (00480f5c)
0040345a e972feffff jmp Node!CCpuMemLoad__GetNetNameFromReg+0x151 (004032d1)
0040345f c785acfeffff00000000 mov dword ptr [ebp-0x154],0x0
00403469 c745fcffffffff mov dword ptr [ebp-0x4],0xffffffff
00403470 8d4de8 lea ecx,[ebp-0x18]
00403473 e8e4da0700 call Node!CString__~CString (00480f5c)
00403478 8b85acfeffff mov eax,[ebp-0x154]
[解决办法]
摘个MSDN的例子:
- C/C++ code
HKEY hKey; char szProductType[BUFSIZE]; DWORD dwBufLen=BUFSIZE; LONG lRet; lRet = RegOpenKeyEx( HKEY_LOCAL_MACHINE, "SYSTEM\\CurrentControlSet\\Control\\ProductOptions", 0, KEY_QUERY_VALUE, &hKey ); if( lRet != ERROR_SUCCESS ) return FALSE; lRet = RegQueryValueEx( hKey, "ProductType", NULL, NULL, (LPBYTE) szProductType, &dwBufLen); if( (lRet != ERROR_SUCCESS) || (dwBufLen > BUFSIZE) ) return FALSE; RegCloseKey( hKey );
[解决办法]
看这像是指针错误,应该跟读注册表没关系吧。
好好调试一下。
[解决办法]
检查字符串操作...
[解决办法]
name==NULL???????