type
TForm1 = class(TForm)
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
function InStr(index: integer; str1: string; str2: string): integer;
var
i,len, pos: integer;
begin
pos:=0;
len:=length(str2);
for i:=index to length(str1) do begin
if copy(str1,i,len)=str2 then begin
pos:=i;
break;
end;
end;
result:=pos;
end;
procedure EngineVM(strScript: string);
var
//定义变量
strCommand, strParameters: string;
strParametr: array[0..9] of string;
sSpace: integer;
i: integer;
//переменные команды зашифровать(命令加密)
strText: pointer;
strLen: integer;
strByte: byte;
label
encrypt;
begin
//находим первый пробел в строке
sSpace:=InStr(1,strScript,#32)-1;
if sSpace<>-1 then begin
//все что находится до пробела считаем командой
strCommand:=copy(strScript,1,sSpace);<-这里出错了(main.pas(66): Incompatible types: 'Array' and 'String')
//остальное - параметры
strParameters:=copy(strScript,sSpace+2,Length(strScript));
//заносим параметры записанные через запятую в массив
i:=0;
while InStr(1,strParameters,',')>0 do begin
//ищем запятую
sSpace:=InStr(1,strParameters,',')-1;
//сохраняем в массив параметр от начала строки до найденной запятой
strParametr:=trim(copy(strParameters,1,sSpace));
//отрезаем от строки strParameters добавленный параметр
strParameters:=copy(strParameters,sSpace+2,Length(strParameters));
//увеличиваем счетчик параметров
i:=i+1;
end;
//добавляем последний параметр отдельно,
//так как после него вместо запятой конец строки
strParametr:=copy(strParameters,1,Length(strParameters));
end else begin
//исли пробелов в строке нет, значит у команды скрипта
//нет параметров, потому за команду принимается все строка
strCommand:=strScript;
end;
//Выполняем скрипт
//сюда ты можешь добавить сколько угодно команд
//команда вывода сообщения (требует 3 параметра)
if strCommand='сообщение' then begin
MessageBox(Form1.Handle,pchar(strParametr[0]),pchar(strParametr[1]),StrToInt(strParametr[2]));
//команда шифровки строки и вывода шифрованной строки на экран
end else if strCommand='зашифровать' then begin
strText:=pointer(strParametr[0]);
strByte:=StrToInt(strParametr[1]);
strLen:=Length(strParametr[0]);
asm
mov ecx, strLen
mov eax, strText
dec eax
mov bh, strByte
@encrypt:
xor byte ptr[eax+ecx],bh
loop @encrypt
end;
ShowMessage(strParametr[0]);
end else begin
ShowMessage('Invalid command');
end;
end;
// 看了半天没看出你那一句有什么错,就将你的代码拿到我这里编译了一下,是有出错,但并不是在你指出的那一句上(难怪我看半天看不出什么错) 。而是我下面用红色标明的那两句上。
function InStr(index: integer; str1: string; str2: string): integer;
var
i,len, pos: integer;
begin
pos := 0;
len := length(str2);
for i := index to length(str1) do
begin
if copy(str1,i,len) = str2 then
begin
pos := i;
break;
end;
end;
result := pos;
end;
procedure EngineVM(strScript: string);
var
strCommand, strParameters: string;
strParametr: array[0..9] of string;
sSpace: integer;
i: integer;
strText: pointer;
strLen: integer;
strByte: byte;
label
encrypt;
begin
sSpace := InStr(1,strScript,#32) - 1;
if sSpace <> -1 then
begin
strCommand := copy(strScript,1,sSpace);
strParameters := copy(strScript,sSpace + 2,Length(strScript));
i := 0;
while InStr(1,strParameters,',') > 0 do
begin
sSpace := InStr(1,strParameters,',') - 1;
strParametr[i] := trim(copy(strParameters,1,sSpace));// strParmetr是一个数组类型,所以这里要加上[i]
strParameters := copy(strParameters,sSpace + 2,Length(strParameters));
i := i + 1;
end;
strParametr[i] := copy(strParameters,1,Length(strParameters));// strParmetr是一个数组类型,所以这里也要加上[i]
end
else
begin
strCommand := strScript;
end;
if strCommand = 'сообщение' then
begin
MessageBox(Form1.Handle,pchar(strParametr[0]),pchar(strParametr[1]),StrToInt(strParametr[2]));
end
else if strCommand = 'зашифровать' then
begin
strText := pointer(strParametr[0]);
strByte := StrToInt(strParametr[1]);
strLen := Length(strParametr[0]);
asm
mov ecx, strLen
mov eax, strText
dec eax
mov bh, strByte
@encrypt:
xor byte ptr[eax+ecx],bh
loop @encrypt
end;
ShowMessage(strParametr[0]);
end
else
begin
ShowMessage('Invalid command');
end;
end;