{"id":509,"date":"2023-05-22T13:34:21","date_gmt":"2023-05-22T05:34:21","guid":{"rendered":"https:\/\/www.cuishaofeng.com\/?p=509"},"modified":"2024-10-22T14:40:52","modified_gmt":"2024-10-22T06:40:52","slug":"delphi%e5%a6%82%e4%bd%95%e8%8e%b7%e5%8f%96%e7%a1%ac%e7%9b%98id%e5%ba%8f%e5%88%97%e5%8f%b7","status":"publish","type":"post","link":"https:\/\/www.cuishaofeng.com\/?p=509","title":{"rendered":"delphi\u5982\u4f55\u83b7\u53d6\u786c\u76d8ID\u5e8f\u5217\u53f7"},"content":{"rendered":"<div id=\"core-ai-summary-tool\"><\/div>\n<p><strong>\u00a0\u56e0\u8981\u7528\u5230\u786c\u76d8\u7684\u7269\u7406\u5e8f\u5217\u53f7\uff0cRAD10.4+win11\uff0c\u5927\u5bb6\u53c2\u8003\uff1a<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>function TFrmMain.GetIdeSerialNumber() : PChar; stdcall;\nconst\n  IDENTIFY_BUFFER_SIZE = 512;\ntype\n  TIDERegs = packed record\n     bFeaturesReg: BYTE; \/\/ Used for specifying SMART \"commands\".\n     bSectorCountReg: BYTE; \/\/ IDE sector count register\n     bSectorNumberReg: BYTE; \/\/ IDE sector number register\n     bCylLowReg: BYTE; \/\/ IDE low order cylinder value\n     bCylHighReg: BYTE; \/\/ IDE high order cylinder value\n     bDriveHeadReg: BYTE; \/\/ IDE drive\/head register\n     bCommandReg: BYTE; \/\/ Actual IDE command.\n     bReserved: BYTE; \/\/ reserved for future use. Must be zero.\n  end;\n\n  TSendCmdInParams = packed record\n    \/\/ Buffer size in bytes\n    cBufferSize: DWORD;\n    \/\/ Structure with drive register values.\n    irDriveRegs: TIDERegs;\n    \/\/ Physical drive number to send command to (0,1,2,3).\n    bDriveNumber: BYTE;\n    bReserved: array&#91;0..2] of Byte;\n    dwReserved: array&#91;0..3] of DWORD;\n    bBuffer: array&#91;0..0] of Byte; \/\/ Input buffer.\n  end;\n\n  TIdSector = packed record\n    wGenConfig: Word;\n    wNumCyls: Word;\n    wReserved: Word;\n    wNumHeads: Word;\n    wBytesPerTrack: Word;\n    wBytesPerSector: Word;\n    wSectorsPerTrack: Word;\n    wVendorUnique: array&#91;0..2] of Word;\n    sSerialNumber: array&#91;0..19] of CHAR;\n    wBufferType: Word;\n    wBufferSize: Word;\n    wECCSize: Word;\n    sFirmwareRev: array&#91;0..7] of Char;\n    sModelNumber: array&#91;0..39] of Char;\n    wMoreVendorUnique: Word;\n    wDoubleWordIO: Word;\n    wCapabilities: Word;\n    wReserved1: Word;\n    wPIOTiming: Word;\n    wDMATiming: Word;\n    wBS: Word;\n    wNumCurrentCyls: Word;\n    wNumCurrentHeads: Word;\n    wNumCurrentSectorsPerTrack: Word;\n    ulCurrentSectorCapacity: DWORD;\n    wMultSectorStuff: Word;\n    ulTotalAddressableSectors: DWORD;\n    wSingleWordDMA: Word;\n    wMultiWordDMA: Word;\n    bReserved: array&#91;0..127] of BYTE;\n  end;\n\n  PIdSector = ^TIdSector;\n\n  TDriverStatus = packed record\n    \/\/ \u9a71\u52a8\u5668\u8fd4\u56de\u7684\u9519\u8bef\u4ee3\u7801\uff0c\u65e0\u9519\u5219\u8fd4\u56de0\n    bDriverError: Byte;\n    \/\/ IDE\u51fa\u9519\u5bc4\u5b58\u5668\u7684\u5185\u5bb9\uff0c\u53ea\u6709\u5f53bDriverError \u4e3a SMART_IDE_ERROR \u65f6\u6709\u6548\n    bIDEStatus: Byte;\n    bReserved: array&#91;0..1] of Byte;\n    dwReserved: array&#91;0..1] of DWORD;\n  end;\n\n  TSendCmdOutParams = packed record\n    \/\/ bBuffer\u7684\u5927\u5c0f\n    cBufferSize: DWORD;\n    \/\/ \u9a71\u52a8\u5668\u72b6\u6001\n    DriverStatus: TDriverStatus;\n    \/\/ \u7528\u4e8e\u4fdd\u5b58\u4ece\u9a71\u52a8\u5668\u8bfb\u51fa\u7684\u6570\u636e\u7684\u7f13\u51b2\u533a\uff0c\u5b9e\u9645\u957f\u5ea6\u7531cBufferSize\u51b3\u5b9a\n    bBuffer: array&#91;0..0] of BYTE;\n  end;\nvar\n  hDevice : THandle;\n  cbBytesReturned : DWORD;\n  SCIP : TSendCmdInParams;\n  aIdOutCmd : array&#91;0..(SizeOf(TSendCmdOutParams) + IDENTIFY_BUFFER_SIZE - 1) - 1] of Byte;\n  IdOutCmd : TSendCmdOutParams absolute aIdOutCmd;\n\n  procedure ChangeByteOrder(var Data; Size: Integer);\n  var\n    ptr : PChar;\n    i : Integer;\n    c : Char;\n  begin\n    ptr := @Data;\n\n    for I := 0 to (Size shr 1) - 1 do\n    begin\n      c := ptr^;\n      ptr^ := (ptr + 1)^;\n      (ptr + 1)^ := c;\n      Inc(ptr, 2);\n    end;\n  end;\nbegin\n  Result := ''; \/\/ \u5982\u679c\u51fa\u9519\u5219\u8fd4\u56de\u7a7a\u4e32\n\n  if <mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-luminous-vivid-orange-color\">SysUtils.Win32Platform <\/mark>= VER_PLATFORM_WIN32_NT then  \/\/ Windows NT, Windows 2000\n  begin\n    \/\/ \u63d0\u793a! \u6539\u53d8\u540d\u79f0\u53ef\u9002\u7528\u4e8e\u5176\u5b83\u9a71\u52a8\u5668\uff0c\u5982\u7b2c\u4e8c\u4e2a\u9a71\u52a8\u5668\uff1a '\/\/.\/PhysicalDrive1\/'\n    hDevice := CreateFile('\/\/.\/PhysicalDrive0', GENERIC_READ or GENERIC_WRITE,\n                          FILE_SHARE_READ or FILE_SHARE_WRITE, nil, OPEN_EXISTING, 0, 0);\n  end\n  else \/\/ Version Windows 95 OSR2, Windows 98\n    hDevice := CreateFile('\/\/.\/SMARTVSD', 0, 0, nil, CREATE_NEW, 0, 0);\n\n    if hDevice = INVALID_HANDLE_VALUE then Exit;\n\n    try\n      FillChar(SCIP, SizeOf(TSendCmdInParams) - 1, #0);\n      FillChar(aIdOutCmd, SizeOf(aIdOutCmd), #0);\n      cbBytesReturned := 0;\n\n      \/\/ Set up data structures for IDENTIFY command.\n      with SCIP do\n      begin\n        cBufferSize := IDENTIFY_BUFFER_SIZE;\n\n        \/\/ bDriveNumber := 0;\n        with irDriveRegs do\n        begin\n          bSectorCountReg := 1;\n          bSectorNumberReg := 1;\n\n          \/\/ if Win32Platform=VER_PLATFORM_WIN32_NT then bDriveHeadReg := $A0\n          \/\/ else bDriveHeadReg := $A0 or ((bDriveNum and 1) shl 4);\n          bDriveHeadReg := $A0;\n          bCommandReg := $EC;\n        end;\n      end;\n\n      if not DeviceIoControl(hDevice, $0007C088, @SCIP, SizeOf(TSendCmdInParams) - 1,\n                            @aIdOutCmd, SizeOf(aIdOutCmd), cbBytesReturned, nil) then Exit;\n    finally\n      CloseHandle(hDevice);\n    end;\n\n    with PIdSector(@IdOutCmd.bBuffer)^ do\n    begin\n      ChangeByteOrder(sSerialNumber, SizeOf(sSerialNumber));\n      (Pchar(@sSerialNumber) + SizeOf(sSerialNumber))^ := #0;\n\n      Result := Pchar(@sSerialNumber);\n\n      end;\nend;\r\n<\/code><\/pre>\n\n\n\n<p>\u6ce8\u610f\u4ee3\u7801\u4e2d\u9ad8\u4eae\u90e8\u5206\u4ee3\u7801<\/p>\n\n\n\n<p><mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-luminous-vivid-orange-color\">SysUtils.Win32Platform <\/mark>= VER_PLATFORM_WIN32_NT then  \/\/ Windows NT, Windows 2000<\/p>\n\n\n\n<p>\u5728delphi\u8001\u7248\u672c\u4e2d\u53ef\u4ee5\u4f7f\u7528SysUtils.Win32Platform\u8c03\u7528;\u5728\u65b0\u7248\u672c\u4f1a\u51fa\u9519\u3002<\/p>\n\n\n\n<p>\u800c\u5728delphi XE\u4ee5\u4e0a\u7248\u672c SysUtils \u8981\u6539\u4e3aSystem.SysUtils\u3002<\/p>\n\n\n\n<p>\u53e6\u5916\u53ef\u5728\u4e3b\u7a97\u4f53\u7a0b\u5e8f\u4e2d\u52a0\u5165Timer,\u8bbe\u7f6e\u65f6\u95f4\u7528\u4f5c\u6ce8\u518c\u8f6f\u4ef6\u8bfb\u53d6\u786c\u76d8\u5e8f\u5217\u53f7\u540e\u65b9\u53ef\u4f7f\u7528\u4ee3\u7801\u5982\u4e0b<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>procedure TfrmMain.tmr2Timer(Sender: TObject);\r\nvar\r\n  path:string;\r\nbegin\r\n  \/\/path:=extractfilepath(application.ExeName)+'\u7cfb\u7edf\u6587\u4ef6\u5939\\ACCESS\u6570\u636e\u5e93\u540d.mdb';\r\n  \/\/dm.qry.ConnectionString:='Provider=Microsoft.Jet.OLEDB.4.0;Data Source='+path+';Persist Security Info=False';\r\n  DM.qry.SQL.Clear;\r\n  dm.qry.SQL.Add('select * from sn where id=:id_a');\r\n  DM.qry.Parameters.ParamByName('id_a').value:='RFC'+Trim(GetIdeSerialNumber())+'JNGF';\r\n  DM.qry.Active:=True;\r\n  if DM.qry.RecordCount&lt;=0 then\r\n     begin\r\n       if MessageDlg('\u60a8\u4f7f\u7528\u7684\u8f6f\u4ef6\u672a\u6ce8\u518c,\u8bf7\u8054\u7cfb\u7ba1\u7406\u5458\u6ce8\u518c\u540e\u518d\u4f7f\u7528!' + #13#10#13#10 +\r\n         '                 \u672c\u6b21\u7a0b\u5e8f\u7ec8\u6b62\u4f7f\u7528\uff01\uff01\uff01',  mtError, &#91;mbYes, mbNo], 0) = mrYes\r\n         then\r\n       begin\r\n\r\n       end;\r\n\r\r\n       Application.Terminate;\n<\/code><\/pre>\n\n\n\n<p>\u4ee5\u4e0b\u662f\u7f51\u4e0a\u627e\u7684\u4ee3\u7801\u793a\u4f8b\u5927\u5bb6\u53c2\u8003\uff1a\u83b7\u5f97\u786c\u76d8\u7684ID\u5e8f\u5217\u53f7(XE10.1+WIN8.1)<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>unit Unit1;\r\n\r\ninterface\r\n\r\nuses\r\n  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,\r\n  Dialogs, StdCtrls, ExtCtrls, Vcl.Imaging.jpeg;\r\n\r\ntype\r\n  TForm1 = class(TForm)\r\n    Panel1: TPanel;\r\n    Memo1: TMemo;\r\n    Button1: TButton;\r\n    Label1: TLabel;\r\n    Image1: TImage;\r\n    procedure Button1Click(Sender: TObject);\r\n  private\r\n    { Private declarations }\r\n  public\r\n    { Public declarations }\r\n  end;\r\n\r\nvar\r\n  Form1: TForm1;\r\n\r\nimplementation\r\n\r\n{$R *.dfm}\r\n\r\nfunction GetScsiSerialNumber(const i: smallint): string;\r\ntype\r\n  TScsiPassThrough = record\r\n    Length: Word;\r\n    ScsiStatus: Byte;\r\n    PathId: Byte;\r\n    TargetId: Byte;\r\n    Lun: Byte;\r\n    CdbLength: Byte;\r\n    SenseInfoLength: Byte;\r\n    DataIn: Byte;\r\n    DataTransferLength: ULONG;\r\n    TimeOutValue: ULONG;\r\n    DataBufferOffset: DWORD;\r\n    SenseInfoOffset: ULONG;\r\n    Cdb: array&#91;0..15] of Byte;\r\n  end;\r\n  TScsiPassThroughWithBuffers = record\r\n    spt: TScsiPassThrough;\r\n    bSenseBuf: array&#91;0..31] of Byte;\r\n    bDataBuf: array&#91;0..191] of Byte;\r\n  end;\r\nvar\r\n  dwReturned: DWORD;\r\n  len: DWORD;\r\n  Buffer: array&#91;0..SizeOf(TScsiPassThroughWithBuffers) + SizeOf(TScsiPassThrough) - 1] of Byte;\r\n  sptwb: TScsiPassThroughWithBuffers absolute Buffer;\r\n  hDevice: thandle;\r\nbegin\r\n  Result := '';\r\n  if SysUtils.win32Platform = VER_PLATFORM_WIN32_NT then\r\n  begin\r\n    if i = 0 then\r\n      hDevice := CreateFile('\/\/.\/PhysicalDrive0',\r\n        GENERIC_READ or GENERIC_WRITE,\r\n        FILE_SHARE_READ or FILE_SHARE_WRITE,\r\n        nil, OPEN_EXISTING, 0, 0)\r\n    else\r\n      hDevice := CreateFile('\/\/.\/PhysicalDrive1',\r\n        GENERIC_READ or GENERIC_WRITE,\r\n        FILE_SHARE_READ or FILE_SHARE_WRITE,\r\n        nil, OPEN_EXISTING, 0, 0);\r\n  end\r\n  else exit;\r\n  if hDevice = invalid_handle_value then exit;\r\n  FillChar(Buffer, SizeOf(Buffer), #0);\r\n  with sptwb.spt do\r\n  begin\r\n    Length := SizeOf(TScsiPassThrough);\r\n    CdbLength := 6; \/\/ CDB6GENERIC_LENGTH\r\n    SenseInfoLength := 24;\r\n    DataIn := 1; \/\/ SCSI_IOCTL_DATA_IN\r\n    DataTransferLength := 192;\r\n    TimeOutValue := 2;\r\n    DataBufferOffset := PChar(@sptwb.bDataBuf) - PChar(@sptwb);\r\n    SenseInfoOffset := PChar(@sptwb.bSenseBuf) - PChar(@sptwb);\r\n    Cdb&#91;0] := $12; \/\/  OperationCode := SCSIOP_INQUIRY;\r\n    Cdb&#91;1] := $01; \/\/  Flags := CDB_INQUIRY_EVPD;  Vital product data\r\n    Cdb&#91;2] := $80; \/\/  PageCode            Unit serial number\r\n    Cdb&#91;4] := 192; \/\/ AllocationLength\r\n  end;\r\n  len := sptwb.spt.DataBufferOffset + sptwb.spt.DataTransferLength;\r\n  if DeviceIoControl(hDevice, $0004D004, @sptwb, SizeOf(TScsiPassThrough), @sptwb, len, dwReturned, nil)\r\n    and ((PChar(@sptwb.bDataBuf) + 1)^ = #$80) then\r\n    SetString(Result, PChar(@sptwb.bDataBuf) + 4, Ord((PChar(@sptwb.bDataBuf) + 3)^));\r\nend;\r\n\r\nfunction GetIdeSerialNumber: pchar;\r\nconst IDENTIFY_BUFFER_SIZE = 512;\r\ntype\r\n  TIDERegs = packed record\r\n    bFeaturesReg: BYTE;\r\n    bSectorCountReg: BYTE;\r\n    bSectorNumberReg: BYTE;\r\n    bCylLowReg: BYTE;\r\n    bCylHighReg: BYTE;\r\n    bDriveHeadReg: BYTE;\r\n    bCommandReg: BYTE;\r\n    bReserved: BYTE;\r\n  end;\r\n  TSendCmdInParams = packed record\r\n    cBufferSize: DWORD;\r\n    irDriveRegs: TIDERegs;\r\n    bDriveNumber: BYTE;\r\n    bReserved: array&#91;0..2] of Byte;\r\n    dwReserved: array&#91;0..3] of DWORD;\r\n    bBuffer: array&#91;0..0] of Byte;\r\n  end;\r\n  TIdSector = packed record\r\n    wGenConfig: Word;\r\n    wNumCyls: Word;\r\n    wReserved: Word;\r\n    wNumHeads: Word;\r\n    wBytesPerTrack: Word;\r\n    wBytesPerSector: Word;\r\n    wSectorsPerTrack: Word;\r\n    wVendorUnique: array&#91;0..2] of Word;\r\n    sSerialNumber: array&#91;0..19] of CHAR;\r\n    wBufferType: Word;\r\n    wBufferSize: Word;\r\n    wECCSize: Word;\r\n    sFirmwareRev: array&#91;0..7] of Char;\r\n    sModelNumber: array&#91;0..39] of Char;\r\n    wMoreVendorUnique: Word;\r\n    wDoubleWordIO: Word;\r\n    wCapabilities: Word;\r\n    wReserved1: Word;\r\n    wPIOTiming: Word;\r\n    wDMATiming: Word;\r\n    wBS: Word;\r\n    wNumCurrentCyls: Word;\r\n    wNumCurrentHeads: Word;\r\n    wNumCurrentSectorsPerTrack: Word;\r\n    ulCurrentSectorCapacity: DWORD;\r\n    wMultSectorStuff: Word;\r\n    ulTotalAddressableSectors: DWORD;\r\n    wSingleWordDMA: Word;\r\n    wMultiWordDMA: Word;\r\n    bReserved: array&#91;0..127] of BYTE;\r\n  end;\r\n  PIdSector = ^TIdSector;\r\n  TDriverStatus = packed record\r\n    bDriverError: Byte;\r\n    bIDEStatus: Byte;\r\n    bReserved: array&#91;0..1] of Byte;\r\n    dwReserved: array&#91;0..1] of DWORD;\r\n  end;\r\n  TSendCmdOutParams = packed record\r\n    cBufferSize: DWORD;\r\n    DriverStatus: TDriverStatus;\r\n    bBuffer: array&#91;0..0] of BYTE;\r\n  end;\r\n  procedure ChangeByteOrder(var Data; Size: Integer);\r\n  var\r\n    ptr: Pchar;\r\n    i: Integer;\r\n    c: Char;\r\n  begin\r\n    ptr := @Data;\r\n    for I := 0 to (Size shr 1) - 1 do begin\r\n      c := ptr^;\r\n      ptr^ := (ptr + 1)^;\r\n      (ptr + 1)^ := c;\r\n      Inc(ptr, 2);\r\n    end;\r\n  end;\r\nvar\r\n  hDevice: Thandle;\r\n  cbBytesReturned: DWORD;\r\n  SCIP: TSendCmdInParams;\r\n  aIdOutCmd: array&#91;0..(SizeOf(TSendCmdOutParams) + IDENTIFY_BUFFER_SIZE - 1) - 1] of Byte;\r\n  IdOutCmd: TSendCmdOutParams absolute aIdOutCmd;\r\nbegin\r\n  Result := '';\r\n  if SysUtils.Win32Platform = VER_PLATFORM_WIN32_NT then\r\n    \/\/   Windows   NT,   Windows   2000\r\n    hDevice := CreateFile('\/\/.\/PhysicalDrive0', GENERIC_READ or GENERIC_WRITE,\r\n      FILE_SHARE_READ or FILE_SHARE_WRITE, nil, OPEN_EXISTING, 0, 0)\r\n  else\r\n    \/\/   Version   Windows   95   OSR2,   Windows   98\r\n    hDevice := CreateFile('\/\/.\/SMARTVSD', 0, 0, nil, CREATE_NEW, 0, 0);\r\n  if hDevice = INVALID_HANDLE_VALUE then Exit;\r\n  try\r\n    FillChar(SCIP, SizeOf(TSendCmdInParams) - 1, #0);\r\n    FillChar(aIdOutCmd, SizeOf(aIdOutCmd), #0);\r\n    cbBytesReturned := 0;\r\n    with SCIP do begin\r\n      cBufferSize := IDENTIFY_BUFFER_SIZE;\r\n      with irDriveRegs do begin\r\n        bSectorCountReg := 1;\r\n        bSectorNumberReg := 1;\r\n        bDriveHeadReg := $A0;\r\n        bCommandReg := $EC;\r\n      end;\r\n    end;\r\n    if not DeviceIoControl(hDevice, $0007C088, @SCIP, SizeOf(TSendCmdInParams) - 1,\r\n      @aIdOutCmd, SizeOf(aIdOutCmd), cbBytesReturned, nil) then Exit;\r\n  finally\r\n    CloseHandle(hDevice);\r\n  end;\r\n  with PIdSector(@IdOutCmd.bBuffer)^ do begin\r\n    ChangeByteOrder(sSerialNumber, SizeOf(sSerialNumber));\r\n    (Pchar(@sSerialNumber) + SizeOf(sSerialNumber))^ := #0;\r\n    Result := Pchar(@sSerialNumber);\r\n  end;\r\nend;\r\n\r\nprocedure TForm1.Button1Click(Sender: TObject);\r\nvar\r\n  stmp:String;\r\nbegin\r\n  \/\/\u8bb0\u5f97\u53f3\u51fb\u4ee5\u7ba1\u7406\u5458\u8fd0\u884c\r\n  stmp := StrPas(PAnsiChar(GetIdeSerialNumber));\r\n  if stmp&lt;>'' then\r\n  begin\r\n    Memo1.Lines.Add('\u65e0\u53c2\uff1a' + stmp);\r\n  end\r\n  else\r\n  begin\r\n    stmp := Trim(GetScsiSerialNumber(0));\r\n    Memo1.Lines.Add('\u6709\u53c2:' + stmp);\r\n  end;\r\nend;\r\n\r\nend.<\/code><\/pre>\n\n\n\n<p><strong>\u6ce8\u610f\u4e8b\u9879\uff1a<\/strong><\/p>\n\n\n\n<p>1.\u8bb0\u5f97\u53f3\u51fb\u4ee5\u7ba1\u7406\u5458\u8fd0\u884c\u3002<\/p>\n\n\n\n<p>2.SysUtils \u5728XE\u4e2d\u8981\u6539\u4e3aSystem.SysUtils\u3002<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u00a0\u56e0\u8981\u7528\u5230\u786c\u76d8\u7684\u7269\u7406\u5e8f\u5217\u53f7\uff0cRAD10.4+win11\uff0c\u5927\u5bb6\u53c2\u8003\uff1a \u6ce8\u610f\u4ee3\u7801\u4e2d\u9ad8\u4eae\u90e8\u5206\u4ee3\u7801 SysUtils.Win32Platform = VER_PLATFORM_WIN32_NT then \/\/ Windows NT, Windows&#8230;<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[13],"tags":[72],"topic":[],"_links":{"self":[{"href":"https:\/\/www.cuishaofeng.com\/index.php?rest_route=\/wp\/v2\/posts\/509"}],"collection":[{"href":"https:\/\/www.cuishaofeng.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.cuishaofeng.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.cuishaofeng.com\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.cuishaofeng.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=509"}],"version-history":[{"count":1,"href":"https:\/\/www.cuishaofeng.com\/index.php?rest_route=\/wp\/v2\/posts\/509\/revisions"}],"predecessor-version":[{"id":510,"href":"https:\/\/www.cuishaofeng.com\/index.php?rest_route=\/wp\/v2\/posts\/509\/revisions\/510"}],"wp:attachment":[{"href":"https:\/\/www.cuishaofeng.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=509"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.cuishaofeng.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=509"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.cuishaofeng.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=509"},{"taxonomy":"topic","embeddable":true,"href":"https:\/\/www.cuishaofeng.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftopic&post=509"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}