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);