我在做的过程种遇到的问题就是包装Win32 API时参数的转换不正确.其中麻烦的是传引用或传值的问题.希望有人能总结一个转换规范.
源代码 :
调用
源代码 :
using
System;
using System.Collections.Generic;
using System.Text;
using Microsoft.Win32;
using System.Runtime.InteropServices;
namespace Hooyee.Utils {
public class NetCard {
public static string GetLocalMac() {
List<string> netCardList = GetNetCardList();
List<string>.Enumerator enumNetCard = netCardList.GetEnumerator();
string macAddr = string.Empty;
while (enumNetCard.MoveNext()) {
macAddr = GetPhysicalAddr( enumNetCard.Current );
if (macAddr != string.Empty) {
break;
}
}
return macAddr;
}
public static List<string> GetNetCardList() {
List<string> cardList = new List<string>();
try {
RegistryKey regNetCards = Registry.LocalMachine.OpenSubKey( Win32Utils.REG_NET_CARDS_KEY );
if (regNetCards != null) {
string[] names = regNetCards.GetSubKeyNames();
RegistryKey subKey = null;
foreach (string name in names) {
subKey = regNetCards.OpenSubKey( name );
if (subKey != null) {
object o = subKey.GetValue( "ServiceName" );
if (o != null) {
cardList.Add( o.ToString() );
}
}
}
}
} catch { }
return cardList;
}
private static string GetPhysicalAddr(string cardId) {
string macAddress = string.Empty;
uint device = 0;
try {
string driveName = "\\\\.\\" + cardId;
device = Win32Utils.CreateFile( driveName,
Win32Utils.GENERIC_READ | Win32Utils.GENERIC_WRITE,
Win32Utils.FILE_SHARE_READ | Win32Utils.FILE_SHARE_WRITE,
0, Win32Utils.OPEN_EXISTING, 0, 0 );
if (device != Win32Utils.INVALID_HANDLE_VALUE) {
byte[] outBuff = new byte[6];
uint bytRv = 0;
int intBuff = Win32Utils.PERMANENT_ADDRESS;
if (0 != Win32Utils.DeviceIoControl( device, Win32Utils.IOCTL_NDIS_QUERY_GLOBAL_STATS,
ref intBuff, 4, outBuff, 6, ref bytRv, 0 )) {
string temp = string.Empty;
foreach (byte b in outBuff) {
temp = Convert.ToString( b, 16 ).PadLeft( 2, '0' );
macAddress += temp;
temp = string.Empty;
}
}
}
} finally {
if (device != 0) {
Win32Utils.CloseHandle( device );
}
}
return macAddress;
}
}
Win32Utils
}
using System.Collections.Generic;
using System.Text;
using Microsoft.Win32;
using System.Runtime.InteropServices;
namespace Hooyee.Utils {
public class NetCard {
public static string GetLocalMac() {
List<string> netCardList = GetNetCardList();
List<string>.Enumerator enumNetCard = netCardList.GetEnumerator();
string macAddr = string.Empty;
while (enumNetCard.MoveNext()) {
macAddr = GetPhysicalAddr( enumNetCard.Current );
if (macAddr != string.Empty) {
break;
}
}
return macAddr;
}
public static List<string> GetNetCardList() {
List<string> cardList = new List<string>();
try {
RegistryKey regNetCards = Registry.LocalMachine.OpenSubKey( Win32Utils.REG_NET_CARDS_KEY );
if (regNetCards != null) {
string[] names = regNetCards.GetSubKeyNames();
RegistryKey subKey = null;
foreach (string name in names) {
subKey = regNetCards.OpenSubKey( name );
if (subKey != null) {
object o = subKey.GetValue( "ServiceName" );
if (o != null) {
cardList.Add( o.ToString() );
}
}
}
}
} catch { }
return cardList;
}
private static string GetPhysicalAddr(string cardId) {
string macAddress = string.Empty;
uint device = 0;
try {
string driveName = "\\\\.\\" + cardId;
device = Win32Utils.CreateFile( driveName,
Win32Utils.GENERIC_READ | Win32Utils.GENERIC_WRITE,
Win32Utils.FILE_SHARE_READ | Win32Utils.FILE_SHARE_WRITE,
0, Win32Utils.OPEN_EXISTING, 0, 0 );
if (device != Win32Utils.INVALID_HANDLE_VALUE) {
byte[] outBuff = new byte[6];
uint bytRv = 0;
int intBuff = Win32Utils.PERMANENT_ADDRESS;
if (0 != Win32Utils.DeviceIoControl( device, Win32Utils.IOCTL_NDIS_QUERY_GLOBAL_STATS,
ref intBuff, 4, outBuff, 6, ref bytRv, 0 )) {
string temp = string.Empty;
foreach (byte b in outBuff) {
temp = Convert.ToString( b, 16 ).PadLeft( 2, '0' );
macAddress += temp;
temp = string.Empty;
}
}
}
} finally {
if (device != 0) {
Win32Utils.CloseHandle( device );
}
}
return macAddress;
}
}
Win32Utils
}
调用
using
System;
using System.Collections.Generic;
using System.Text;
namespace Hooyee.Utils
{
class Program
{
static void Main(string[] args)
{
string macAddr = NetCard.GetLocalMac();
Console.WriteLine(macAddr);
Console.ReadLine();
}
}
}
using System.Collections.Generic;
using System.Text;
namespace Hooyee.Utils
{
class Program
{
static void Main(string[] args)
{
string macAddr = NetCard.GetLocalMac();
Console.WriteLine(macAddr);
Console.ReadLine();
}
}
}