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

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); 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值