通过RegOpenKeyEx和RegQueryValueEx获取wince设备的IP

来源:互联网 发布:淘宝嗅觉系是真的吗? 编辑:程序博客网 时间:2024/05/21 05:17

wince嵌入式应用程序

// test_api.cpp : 定义应用程序的入口点。#include "stdafx.h"#include "test_api.h"#include <windows.h>#include <commctrl.h>#include <time.h>#include <stdio.h>typedef struct _NETWORK_ADPT_INFO {    BOOL    fUseDHCP;    BOOL    fSaved;    DWORD   IPAddr;    DWORD   SubnetMask;    DWORD   Gateway;    DWORD   DNSAddr;    DWORD   DNSAltAddr;    DWORD   WINSAddr;    DWORD   WINSAltAddr;} NETWORK_ADPT_INFO, *PNETWORK_ADPT_INFO;BOOL StringToAddr(TCHAR *AddressString, DWORD *AddressValue) {    TCHAR   *pStr = AddressString;    PUCHAR  AddressPtr = (PUCHAR)AddressValue;    int     i;    int     Value;    // Parse the four pieces of the address.    for (i=0; *pStr && (i < 4); i++) {        Value = 0;        while (*pStr && TEXT('.') != *pStr) {            if ((*pStr < TEXT('0')) || (*pStr > TEXT('9'))) {                return FALSE;            }            Value *= 10;            Value += *pStr - TEXT('0');            pStr++;        }        if (Value > 255) {            return FALSE;        }        AddressPtr[i] = Value;        if (TEXT('.') == *pStr) {            pStr++;        }    }    // Did we get all of the pieces?    if (i != 4) {        return FALSE;    }    return TRUE;}   VOID GetMultiSZAddr (HKEY hKey, LPTSTR szValueName, LPDWORD pAddr1, LPDWORD pAddr2){    TCHAR   szTemp[256];    LPTSTR  szPtr;    LONG    hRes;    DWORD   dwSize, dwType;    dwSize = sizeof(szTemp);    hRes = RegQueryValueEx (hKey, szValueName, 0, &dwType, (LPBYTE)szTemp,&dwSize);     if ((hRes == ERROR_SUCCESS) &&        ((dwType == REG_SZ) || (dwType == REG_MULTI_SZ))) {        if (pAddr1 && szTemp[0]) {            StringToAddr (szTemp, pAddr1);        }        if (pAddr2 && szTemp[0] && (dwType == REG_MULTI_SZ)) {            szPtr = szTemp;            while (*szPtr) {                szPtr++;            }            // Move past the null.            szPtr++;            if (*szPtr) {                StringToAddr (szPtr, pAddr2);            }        }    }}BOOL GetIPAddress(wchar_t * pAdapterName,PNETWORK_ADPT_INFO pAdapter){    wchar_t strKeyName[64];    DWORD   type;    memset ((char *)pAdapter, 0, sizeof(NETWORK_ADPT_INFO));    pAdapter->fUseDHCP = TRUE;    swprintf(strKeyName,L"Comm\\%s\\Parms\\TCPIP",pAdapterName);    HKEY   hKey;     if(RegOpenKeyEx(HKEY_LOCAL_MACHINE,strKeyName,0,KEY_WRITE,&hKey) != ERROR_SUCCESS)          return FALSE;        DWORD dwSize = sizeof(DWORD);    LONG  hRes = RegQueryValueEx (hKey, TEXT("EnableDHCP"), 0, &type,(LPBYTE)&pAdapter->fUseDHCP,&dwSize);    if(hRes == ERROR_SUCCESS && !pAdapter->fUseDHCP){        GetMultiSZAddr (hKey, TEXT("IpAddress"),&pAdapter->IPAddr, NULL);        GetMultiSZAddr (hKey, TEXT("Subnetmask"),&pAdapter->SubnetMask, NULL);        GetMultiSZAddr (hKey, TEXT("DefaultGateway"),&pAdapter->Gateway, NULL);    }    GetMultiSZAddr (hKey, TEXT("DNS"), &pAdapter->DNSAddr,&pAdapter->DNSAltAddr);    RegCloseKey(hKey);    return TRUE;}void IPAddrToStr (char* szStr, DWORD IPAddr){    sprintf(szStr, "%d.%d.%d.%d", IPAddr & 0xFF , (IPAddr >> 8) & 0xFF ,        (IPAddr >> 16) & 0xFF, (IPAddr >> 24) & 0xFF);}int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow){    wchar_t UsbNetWorkName[32] = L"EMAC1";    NETWORK_ADPT_INFO tAdapterInfo = {0};    char g_localip[16] = {0};    printf("\n\n######\n");    if (GetIPAddress((wchar_t*)UsbNetWorkName,&tAdapterInfo)){        IPAddrToStr(g_localip,tAdapterInfo.IPAddr);        printf("IPAddrToStr >>> %s\n", g_localip);    }else{        printf("IPAddrToStr >>> %s\n", "failed");    }    printf("######\n\n");    return 0;}

在嵌入式平台上运行结果

加载模块: test_api.exe加载模块: coredll.dll######IPAddrToStr >>> 192.168.1.123######程序“[3ae0036] test_api.exe”已退出,返回值为 0 (0x0)。

关于使用EMAC1
这是一个焊接了EMAC1网卡芯片的wince嵌入式设备
在程序中使用注册表,不外乎创建、打开、读取、设置、删除这五个常规操作
创建键值 RegCreateKeyEx
打开键值 RegOpenKeyEx
读取键值 RegQueryValueEx
设置键值 RegSetValueEx
删除键值 RegDeketeKey

例程中读取网卡芯片EMAC1中IP对应的键值,用到对应的接口 RegOpenKeyEx RegQueryValueEx

附Linux下获取本地IP
在Linux下面使用结构体struct ifreq获取IP地址,wince程序中并不提供对应的接口

char *ipaddr;struct hostent  *hp;int sockfd;   struct sockaddr_in sin;   struct ifreq ifr;         sockfd = socket(AF_INET, SOCK_DGRAM, 0);      if (sockfd == -1)   {                 return -1;            }         strncpy(ifr.ifr_name, "eth0", IFNAMSIZ);//网卡多的得修改下  ifr.ifr_name[IFNAMSIZ - 1] = 0;       if (ioctl(sockfd, SIOCGIFADDR, &ifr) < 0){                 return -1;    }     memcpy(&sin, &ifr.ifr_addr, sizeof(sin));     ipaddr=inet_ntoa(sin.sin_addr); 
原创粉丝点击