首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

看看这样读注册表对不对?解决办法

2012-01-29 
看看这样读注册表对不对?C/C++ codechar path[254]SYSTEM\\CurrentControlSet\\Control\\Network\\{4D36

看看这样读注册表对不对?

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???????

热点排行