Ответ зависит от языка. Я недавно встретил парня, компания которого разрабатывает стек USB, который работает на многих популярных сотовых телефонах (например, таким образом, Ваш телефон может говорить с Вашим компьютером). У них есть правило в их магазине, что все процедуры C должны быть повторно используемы. На практике то, что это означает, - то, что вместо глобальных переменных, они используют дополнительный параметр для каждой стандартной программы; параметр указывает на состояние, которое должно сохраниться между стандартными программами.
я использую эту технику все время для абстракций с состоянием. Пример: абстракция читателя для фотографических изображений: читатель обеспечивает доступ к одному пикселю за один раз; это должно знать открытый дескриптор файла, какова текущая позиция в изображении, таким образом, на и т.д. Вся эта информация входит в частную структуру C или членов парламента, не занимающих официального поста класса C++. Никакие глобальные переменные. Внешний мир видит:
typedef struct Pnmrdr_T *Pnmrdr_T;
struct Pnmrdr_T *Pnmrdr_new(FILE *);
pixel Pnmrdr_get(Pnmrdr_T);
void Pnmrdr_close(Pnmrdr_T);
void Pnmrdr_free(Pnmrdr_T *rp); // frees memory and sets *rp = NULL
Этот стиль программирования очень похож на методы OO.
, Почему лучше, чем глобальные переменные? нет никаких неожиданностей . Если что-то идет не так, как надо, или Вы хотите добавить опцию, Вы знаете, что все явно в значениях, переданных в. Кроме того, Вы знаете, что можно включить много модулей вместе, и они не вмешаются, если Вы явно не передадите состояние между ними. Мой контакт в бизнесе сотового телефона говорит, что это свойство было огромно для его компании---, они - комплект оборудования программного обеспечения OEM, и они могут легко включить различные части вместе для различных клиентов.
мне действительно нравится программировать этот путь, потому что я добираюсь для наблюдения всего, на что это идет, и мои частные структуры данных защищены от любопытных глаз:-)
Я думаю, вам нужно получить серийный номер из BIOS следующим образом:
Select SerialNumber From Win32_BIOS
На Dell я считаю, что это соответствует метке обслуживания
Вот код C #, который должен его получить
Вот я получаю из Win32_ComputerSystem , но при желании вы можете легко преобразовать его для повторного запуска Win32_Bios
void GetComputerSystem()
{
// http://msdn.microsoft.com/en-us/library/aa394102(VS.85).aspx
ManagementObjectCollection oReturnCollection;
try
{
ObjectQuery query = new ObjectQuery("Select UserName,Name,Manufacturer,Model from Win32_ComputerSystem");
ManagementObjectSearcher oSearcher = new ManagementObjectSearcher(gManager, query);
oReturnCollection = oSearcher.Get();
oSearcher.Dispose();
}
catch
{
gHasError = true;
return;
}
//loop through found drives and write out info
foreach (ManagementObject oReturn in oReturnCollection)
{
// Disk name
object oLoggedInUser = oReturn["UserName"];
if (oLoggedInUser == null)
gOSInfo.UserName = "None";
else
gOSInfo.UserName = (string)oLoggedInUser;
string Manufacturer = (string)oReturn["Manufacturer"];
string Model = (string)oReturn["Model"];
}
}
}
namespace Con2
{
using System;
using System.Management;
using System.IO;
class Program
{
public static string computerName = "localhost";
// a central place to store the info,
public static string inventFile = @"\\Wdstorage\public\install\Inventfile.txt";
static void Main(string[] args)
{
try
{
FileStream fileStream = new FileStream(inventFile, FileMode.Append);
if (File.Exists(inventFile))
{
using (StreamWriter sw = new StreamWriter(fileStream))
{
sw.Write("Added: " + DateTime.Now.ToString());
ManagementScope scope = new ManagementScope(@"\\" + computerName + @"\root\cimv2");
scope.Connect();
ObjectQuery query = new ObjectQuery("Select * From Win32_SystemEnclosure");
ManagementObjectSearcher searcher = new ManagementObjectSearcher(scope, query);
ManagementObjectCollection objColl = searcher.Get();
foreach (ManagementObject o in objColl)
{
Console.WriteLine("ServiceTag=" + o["SerialNumber"].ToString());
sw.Write(", ServiceTag=" + o["SerialNumber"].ToString());
}
query = new ObjectQuery("Select * from Win32_ComputerSystem");
searcher = new ManagementObjectSearcher(scope, query);
objColl = searcher.Get();
foreach (ManagementObject oReturn in objColl)
{
string Manufacturer = (string)oReturn["Manufacturer"];
sw.Write(", Manufacturer=" + (string)oReturn["Manufacturer"]);
string Model = (string)oReturn["Model"];
sw.Write(", Model=" + (string)oReturn["Model"]);
string name = (string)oReturn["Name"];
sw.Write(", name=" + (string)oReturn["name"]);
string userName = (string)oReturn["UserName"];
sw.Write(", userName=" + (string)oReturn["userName"]);
Console.WriteLine((string)oReturn["Manufacturer"]);
Console.WriteLine((string)oReturn["Model"]);
Console.WriteLine((string)oReturn["Name"]);
Console.WriteLine((string)oReturn["UserName"]);
}
sw.WriteLine();
sw.Close();
}
}
// else
}
catch (Exception ex)
{
Console.WriteLine("Error :" + ex.Message );
Console.WriteLine("Prova att köra programmet en gång till..");
}
Console.WriteLine("");
Console.Write("<Enter> to quit :");
Console.ReadLine();
}
}
}