English 中文(简体)
How to generate an unique computer id on Delphi?
原标题:

How can I quickly generate an unique computer id for a delphi app? I used to do it easly with c#, but this failed sometimes. I do want the ID to be "static" but I don t care if the id changes because of a hardware change or OS reinstallation, I was planning to store it in the registry and check it when the app starts, and if it changed update the registry. (I know how to code the registry part, I only need help for the unique id).

Thanks.

最佳回答
问题回答

Have a look at SysUtils.CreateGUID which creates a globally unique identifier. Syntax:

function CreateGUID(out Guid: TGUID): HResult; stdcall;

A small example taken from D2010 s help:

{
This example demonstrates the usage of some GUID 
related routines along with the type itself.
}
procedure TForm2.FormCreate(Sender: TObject);
var
  MyGuid0, MyGuid1 : TGUID;

begin
  { Create a new GUID from the string representation. }
  MyGuid0 := StringToGUID( {00020400-0000-0000-C000-000000000046} );
  Memo1.Lines.Add( The GUID is:   + GUIDToString(MyGuid0));

  {
  Accessing GUID s internal fields
  Using the Format function to obtain the same output as GUIDToString
  }
  Memo1.Lines.Add(Format( GUID using formatting is:   +
        {%0.8X-%0.4X-%0.4X-%0.2X%0.2X-%0.2X%0.2X%0.2X%0.2X%0.2X%0.2X} ,
       [MyGuid0.D1, MyGuid0.D2, MyGuid0.D3,
       MyGuid0.D4[0], MyGuid0.D4[1], MyGuid0.D4[2], MyGuid0.D4[3],
       MyGuid0.D4[4], MyGuid0.D4[5], MyGuid0.D4[6], MyGuid0.D4[7]]));

  { Autogenerate a random GUID at run time. }
  if CreateGUID(MyGuid1) <> 0 then
     Memo1.Lines.Add( Creating GUID failed! )
  else
     Memo1.Lines.Add( The generated guid is:   + GUIDToString(MyGuid1));

  { Generating second random GUID. }
  CreateGUID(MyGuid0);

  { Testing if two guids are equal. }
  if IsEqualGUID(MyGuid0, MyGuid1) then
     Memo1.Lines.Add( This cannot happen! CreateGUID guarantees that   +
                      2 randomly generated GUIDs cannot be equal! );
end;

HTH

I m not exactly sure what you re asking? It might help if you clarified why you need the "unique computer id".

Option 1

The bit:

"I was planning to store it in the registry and check it when the app starts, and if it changed update the registry."

gives me the impression you re trying to detect a different (newer) version of the app and/or identify different apps within a suite.

If this is the case, then simply pressing Ctrl+Shift+G will generate a unique GUID for you and insert it at your current cursor position in code. You may want to also look at the version information; perhaps auto-increment build numbers?

Option 2

If you re trying to in some way identify unique installations on different computers, take a look at the CreateGUID function in plainth s answer.

Option 3

You mentioned that you "don t care if the id changes because of a hardware change or OS reinstallation". I m not sure if this is an important fact like: you re trying to detect hardware changes? After all, you did say you don t care; but then why mention this at all?

Option 4

Something else I haven t considered?

You may try using an UUID algorithm for the following reasons:

  • It independs hardware
  • It`s really random
  • It is platform independent.

But watch out: to achieve hardware independence, you must choose some algorithm which does not use the MAC address of the machine. Microsoft`s GUID uses it (this was how they discovered who wrote that LOVE YOU virus, remember it?)





相关问题
determining the character set to use

my delphi 2009 app has a basic translation system that uses GNUGetText. i had used some win API calls to prepare the fonts. i thought it was working correctly until recently when someone from Malta ...

Help with strange Delphi 5 IDE problems

Ok, I m going nuts here. For the last (almost) four years, I ve been putting up with some extremely bad behavior from my Delphi 5 IDE. Problems include: Seemingly random errors in coride50.bpl ...

How to write a Remote DataModule to run on a linux server?

i would like to know if there are any solution to do this. Does anyone? The big picture: I want to access data over the web, using my delphi thin clients. But i´would like to keep my server/service ...

How convert string to integer in Oxygene

In Delphi, there is a function StrToInt() that converts a string to an integer value; there is also IntToStr(), which does the reverse. These functions doesn t appear to be part of Oxygene, and I can ...

Quick padding of a string in Delphi

I was trying to speed up a certain routine in an application, and my profiler, AQTime, identified one method in particular as a bottleneck. The method has been with us for years, and is part of a "...

热门标签