[Error] mainfrm.pas(12): Unsafe pointer only allowed if compiling with {$UNSAFECODE ON}
是什么意思,怎么改啊,好象程序没有错误,是要配置什么吧

解决方案 »

  1.   

    在声明之前加上{$UNSAFECODE ON}但最后你要确保你的代码是安全的,还是要将不安全的代码替换掉
      

  2.   

    [Error] mainfrm.pas(73): Unsafe code only allowed in unsafe procedure
    procedure 怎么加unsafe啊
      

  3.   

    麻烦楼上了,我是个新手,能不能向.net里设置debug里的可以使用不安全代码那样设置一下呢,我用的是delphi8,如果用delphi6是不是就不会有这样的问题了呢,下面是我的代码,能帮我看看吗,我不知道怎样在“类声明”前加unsafe ,我的语法不熟悉。
      

  4.   

    unit mainfrm;interfaceuses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      StdCtrls, ExtCtrls, System.ComponentModel;
    {$UNSAFECODE ON}
    var
       SerialNumber:longint; //Serial Number
       UserKey:longint;  //User Key
       InDogData: ^byte;
       OutDogData: ^byte;type
      TForm1 = class(TForm)
        Bevel1: TBevel;
        Label1: TLabel;
        Label2: TLabel;
        GroupBox2: TGroupBox;
        ButtonCancel: TButton;
        LabelResult: TLabel;
        Label3: TLabel;
        Edit1: TEdit;
        Label4: TLabel;
        Edit2: TEdit;
        DogCheck: TButton;
        CurrentNo: TButton;
        DogCheckEx: TButton;
      procedure ButtonCancelClick(Sender: TObject);
      procedure CurrentNoClick(Sender: TObject);
      procedure DogCheckClick(Sender: TObject);
      procedure DogCheckExClick(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation
     {$UNSAFECODE ON}
    {$R *.DFM}
      { The type of these four functions are longint }
       function CreateRandom: longint; external;
      function GetCurrentNumber: longint; external;
      function Encrypt: longint; external;
      function Decrypt: longint; external;
      function EncryptEx: longint; external;
      function DecryptEx: longint; external;
       {$L gaw32del.obj}procedure  TForm1.ButtonCancelClick(Sender: TObject);
    begin
         Close();
    end; procedure TForm1.CurrentNoClick(Sender: TObject);var   dwRetCode:longint;
          dwCurrentNumber:longint;
          szMessage: AnsiString;begin
         SerialNumber := StrToInt64(Edit1.Text); {set the SerialNumber}
         if (SerialNumber = 0)  then
             MessageDlg('Please input correct SerialNumber!', mtInformation,         [mbOk], 0);     OutDogData := @dwCurrentNumber;
         dwRetCode := GetCurrentNumber();
         if (dwRetCode<>0)  then
         begin
              szMessage:= 'get current no failed.'+#13;
              szMessage:= szMessage + 'error code = '+IntToStr(dwRetCode);
         end
         else
         begin
              szMessage:= 'Get Current No suceeded.'+#13;
              szMessage:= szMessage + 'CurrentNumber = '+IntToStr(dwCurrentNumber);
         end;
         LabelResult.SetTextBuf ( PCHAR(szMessage) );end;procedure TForm1.DogCheckClick(Sender: TObject);
    var  dwRetCode,i:longint;
         szMessage,msg1,msg2,msg3: AnsiString;
         result1,result2,randomdata:string[16];
         b1 :boolean;
    begin    SerialNumber := StrToInt64(Edit1.Text); {set the SerialNumber}
        if (SerialNumber = 0)  then
             MessageDlg('Please input correct SerialNumber!', mtInformation,
             [mbOk], 0);
        UserKey := StrToInt64(Edit2.Text); {set the UserKey}
        if (UserKey = 0)  then
             MessageDlg('Please input correct UserKey!', mtInformation,
             [mbOk], 0);    OutDogData := @randomdata[1];
        CreateRandom();                     //Get Random    InDogData :=@randomdata[1];
        OutDogData := @result1[1];
        dwRetCode :=Encrypt();          //Call Challenge function    InDogData :=@result1[1];
        OutDogData := @result2[1];
        dwRetCode := Decrypt(); //Call Response function    if (dwRetCode = 0) then
        begin
            b1 := TRUE;
            msg1 := 'CreateRandom Success. Random  Data ='+#13;
            msg2 := 'Encrypt Success. Encrypt Data ='+#13;
            msg3 := 'Decrypt Success. Decrypt Data ='+#13;
            for i:= 1 to 16 do
            begin
               msg1:= msg1 + IntTohex(ord(randomdata[i]),2)+' ';
               msg2:= msg2 + IntTohex(ord(result1[i]),2)+' ';
               msg3:= msg3 + IntTohex(ord(result2[i]),2)+' ';
           if (randomdata[i]<>result2[i]) then
               b1 := FALSE;
            end;
            msg1:= msg1 + #13 + #13;
            msg2:= msg2 + #13 + #13;
            msg3:= msg3 + #13 + #13;
            if (b1) then
                szMessage := 'Check Dog Success.                 '+#13
            else
                szMessage := 'Check Dog Fail. Ret Data Error     '+#13;
            szMessage:=szMessage+msg1+msg2+msg3;
        end
        else
        begin
           szMessage:= 'Check Dog Fail.';
           szMessage:= szMessage + 'error code = '+IntToStr(dwRetCode);
        end;
        LabelResult.SetTextBuf ( PCHAR(szMessage) );end;procedure TForm1.DogCheckExClick(Sender: TObject);
    var  dwRetCode,i:longint;
         szMessage,msg1,msg2,msg3: AnsiString;
         result1,result2,randomdata:string[16];
         b1 :boolean;
    begin
           
        SerialNumber := StrToInt64(Edit1.Text); {set the SerialNumber}
        if (SerialNumber = 0)  then
             MessageDlg('Please input correct SerialNumber!', mtInformation,
             [mbOk], 0);
        UserKey := StrToInt64(Edit2.Text); {set the UserKey}
        if (UserKey = 0)  then
             MessageDlg('Please input correct UserKey!', mtInformation,
             [mbOk], 0);    OutDogData := @randomdata[1];
        CreateRandom();                     //Get Random    InDogData :=@randomdata[1];
        OutDogData := @result1[1];
        dwRetCode:=EncryptEx();                   //Call Challenge function    InDogData :=@result1[1];
        OutDogData := @result2[1];          
        dwRetCode := DecryptEx(); //Call Response function    if (dwRetCode = 0) then
        begin
            b1 := TRUE;
            msg1 := 'CreateRandom Success. Random  Data ='+#13;
            msg2 := 'EncryptEx Success. Encrypt Data ='+#13;
            msg3 := 'DecryptEx Success. Decrypt Data ='+#13;
            for i:= 1 to 16 do
            begin
               msg1:= msg1 + IntTohex(ord(randomdata[i]),2)+' ';
               msg2:= msg2 + IntTohex(ord(result1[i]),2)+' ';
               msg3:= msg3 + IntTohex(ord(result2[i]),2)+' ';
           if (randomdata[i]<>result2[i]) then
               b1 := FALSE;
            end;
            msg1:= msg1 + #13 + #13;
            msg2:= msg2 + #13 + #13;
            msg3:= msg3 + #13 + #13;
            if (b1) then
                szMessage := 'Check Dog Success.                 '+#13
            else
                szMessage := 'Check Dog Fail. Ret Data Error     '+#13;
            szMessage:=szMessage+msg1+msg2+msg3;
        end
        else
        begin
           szMessage:= 'Check Dog Fail.';
           szMessage:= szMessage + 'error code = '+IntToStr(dwRetCode);
        end;
        LabelResult.SetTextBuf ( PCHAR(szMessage) );
    end;end.
      

  5.   

    在项目管理器中,将UNSAFE提示关掉就可以了,不用管它
      

  6.   

    project->options->compiler messages
    是这里吧,我去掉了,那个好象只是提示。
      

  7.   

    楼主用的一定是Delphi 。NET 
    .NET里面通过不安全代码确实可以使用指针.但是你兺鞥分配内存
    而且使用指针的时候还要,声明成Unsafe的.而且也要打开Unsafe编译开关
    如下
    {$UNSAFECODE ON}
    procedure A;unsafe;
    .........
    procedure A;unsafe;
    begin
       这里面才可以使用指针,但是.NET里面使用指针还是受到限制的.就是兺鞥分配内存
       只能指向现有的数据
    end;
    {$UNSAFECODE OFF}