0

GUIDを使用してアプリケーションを一意に識別し、コード内からこの値を取得したいと思います。DPROJに理想的なGUIDがあることがわかります。

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    <PropertyGroup>
        <ProjectGuid>{D4DB842C-FB4C-481B-8952-77DA04E37102}</ProjectGuid>

これは、たとえばリソースとして、どこでもexeファイルに入りますか?そうでない場合は、このGUID値をexeファイルにリンクしてコードで読み取る最も簡単な方法は何ですか。上記のGUIDは専用のテキストファイルにあり、DprojMakerツールを使用してDPROJに貼り付けられるため、提案するものに含めることができます。ありがとう

4

2 に答える 2

3

AFAIKは<ProjectGUID>Exeファイルに埋め込まれていませんが、プロジェクトGUIDを読み取り、exeにリソースとして挿入するアプリケーションを作成できます。

ファイルを読み取り、exeファイルのリソースを作成/更新するこのサンプルアプリを確認してください。

program UpdateResEXE;

{$APPTYPE CONSOLE}

uses
  Classes,
  Windows,
  SysUtils;

//you can improve this method to read the ProjectGUID value directly from the dproj file using XML.
procedure UpdateExeResource(Const Source, ResourceName, ExeFile:string);
var
  LStream    : TFileStream;
  hUpdate    : THANDLE;
  lpData     : Pointer;
  cbData     : DWORD;
begin
  LStream := TFileStream.Create(Source,fmOpenRead or fmShareDenyNone);
  try
    LStream.Seek(0, soFromBeginning);
    cbData:=LStream.Size;
    if cbData>0 then
    begin
      GetMem(lpData,cbData);
      try
        LStream.Read(lpData^, cbData);
        hUpdate:= BeginUpdateResource(PChar(ExeFile), False);
        if hUpdate <> 0 then
          if UpdateResource(hUpdate, RT_RCDATA, PChar(ResourceName),0,lpData,cbData) then
          begin
            if not EndUpdateResource(hUpdate,FALSE) then RaiseLastOSError
          end
          else
          RaiseLastOSError
        else
        RaiseLastOSError;
      finally
        FreeMem(lpData);
      end;
    end;
  finally
    LStream.Free;
  end;
end;

begin
  try
    if ParamCount<>3 then
    begin
     Writeln('Wrong parameters number');
     Halt(1);
    end;
    Writeln(Format('Adding/Updating resource %s in %s',[ParamStr(2), ParamStr(3)]));
    UpdateExeResource( ParamStr(1), ParamStr(2), ParamStr(3));
    Writeln('Done');
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
end. 

これで、アプリから、ビルド後のイベントを使用して、この方法でこのアプリケーションを呼び出すことができます

"C:\The path where is the tool goes here\UpdateResEXE.exe"  "C:\The path of the file which contains the ProjectGUID goes here\Foo.txt"  Project_GUID  "$(OUTPUTPATH)"

そして、そのように使用します:

{$APPTYPE CONSOLE}

uses
  Windows,
  Classes,
  System.SysUtils;


function GetProjectGUID : string;
var
  RS: TResourceStream;
  SS: TStringStream;
begin
  RS := TResourceStream.Create(HInstance, 'Project_GUID', RT_RCDATA);
  try
    SS:=TStringStream.Create;
    try
      SS.CopyFrom(RS, RS.Size);
      Result:= SS.DataString;
    finally
     SS.Free;
    end;
  finally
    RS.Free;
  end;
end;


begin
  try
    Writeln(Format('Project GUID %s',[GetProjectGUID]));
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
  readln;
end.
于 2012-11-06T17:30:27.547 に答える
2

コード自体の中に独自のGUIDをハードコーディングしないのはなぜですか?コードエディタにはCTRL+SHIFT+G、現在アクティブなコード行に新しいGUID文字列を生成するためのキーボードショートカットがあります。その宣言を定数変数に微調整して、コードが必要に応じて使用できるようにすることができます。例:

const
  MyGuid: TGUID = '{04573E0E-DE08-4796-A5BB-E5F1F17D51F7}';
于 2012-11-06T19:08:25.770 に答える