Как перевести на Delphi

SkyS
Дата: 16.05.2011 04:41:16
Доброго времени суток
Перевожу функцию на делфи с vbs и возник затык в одной строчке
p(66-j)=(a\24) And 255 
Что то не могу понять как это перевести.




Не откладывай на завтра то что можно сделать послезавтра :)
x1ca4064
Дата: 16.05.2011 04:44:08
SkyS,


Если "\" - целочисленное деление (я не помню, что в vbs):

p[66-j]:=(a div 24) and 255;
SkyS
Дата: 16.05.2011 05:58:19
хм .. спс ... получилось но не так как хотелось бы ... точнее результат не тот который я ожидал ..

в общем..
есть скриптик
Set WshShell = CreateObject("WScript.Shell")
MicroSoft = "HKLM\SOFTWARE\Microsoft"
DigitalProductIdWindows = MicroSoft & "\Windows NT\CurrentVersion\DigitalProductId"
On Error Resume Next
Set Word = CreateObject("Word.Application")
DigitalProductIdOffice = MicroSoft & "\Office\" & word.Version & "\Registration\" & _
    word.ProductCode & "\DigitalProductId"
If Err.Number = 0 Then
    Word.Quit
    OfficeKey = GetKey(WshShell.RegRead(DigitalProductIdOffice))
    WScript.Echo "Ключ MS Office: " & OfficeKey
Else
    WScript.Echo "Возможно, MS Office не установлен."
End If
On Error GoTo 0
 
WindowsKey = GetKey(WshShell.RegRead(DigitalProductIdWindows))
WScript.Echo "Ключ Windows: " & WindowsKey
 
Function GetKey(byval p)
    pc="BCDFGHJKMPQRTVWXY2346789"
    For i=0 To 28
        a=0
        For j=0 To 14 
            a=p(66-j)+a*256 
            p(66-j)=(a\24) And 255 
            a=a Mod 24
        Next
        ProductKey = Mid(pc,a+1,1) & ProductKey
        If (((i+2) Mod 6)=0) And (i<28) Then
            i=i+1
            ProductKey = "-" & ProductKey
        End If
    Next
    GetKey = ProductKey
End Function

который вытаскивает с реестра номера ключей ...
переписал его на Delphi
var
   reg: TRegistry;
    Key:HKey;
    temp,temp1:TStringList;
    i,j:integer;
     buf: array of byte;
     info: TRegDataInfo;
     sz:word;
begin
reg := TRegistry.Create;

reg.RootKey := HKEY_LOCAL_MACHINE;
reg.RegistryConnect(edit1.text);
reg.OpenKey('SOFTWARE\Microsoft\Windows NT\CurrentVersion\',false);


 reg.GetDataInfo('DigitalProductId', info);
 sz := info.DataSize;
 SetLength(buf, sz);
reg.ReadBinaryData('DigitalProductId',buf[0],sz);
edit2.Text:= GetKey(buf);
...........................
...........................
function Tmain.GetKey(p:array of byte): String;
var pc,ProductKey:string;
i,j:integer;
a:integer;
begin
ProductKey:='';
 pc:='BCDFGHJKMPQRTVWXY2346789';
    For i:=0 To 28 do
    begin
        a:=0 ;
        For j:=0 To 14 do
        begin
            a:=p[66-j]+a*256;
            p[66-j]:=(a div 24) and 255;
            a:=a Mod 24;
        end;
        ProductKey := copy(pc,a+1,1)  + ProductKey  ;
        If (((i+2) Mod 6)=0) And (i<28) Then
    begin
        ProductKey :='-' + ProductKey;
    End;
    end;
    result:= ProductKey ;
end;

Правильно ли я перевел так как результат в delphi не совпадает с результатом работы скрипта =\
x1ca4064
Дата: 16.05.2011 07:13:03
SkyS,

Несовсем: Вы забыли инкрементировать i (когда черточки добавляются).

[src]
function GetKey(p:array of byte): String;
var pc,ProductKey:string;
i,j:integer;
a:integer;
begin
ProductKey:='';
pc:='BCDFGHJKMPQRTVWXY2346789';
i:=0;
while i<=28 do
begin
a:=0 ;
For j:=0 To 14 do
begin
a:=p[66-j]+a*256;
p[66-j]:=(a div 24) and 255;
a:=a Mod 24;
end;
ProductKey := copy(pc,a+1,1) + ProductKey ;
If (((i+2) Mod 6)=0) And (i<28) Then
begin
inc(i);
ProductKey :='-' + ProductKey;
End;
inc(i);
end;
Result:= ProductKey ;
end;
[src]
SkyS
Дата: 16.05.2011 09:11:33
спс все заработало =)))