unsafe的错误提示? [Error] mainfrm.pas(12): Unsafe pointer only allowed if compiling with {$UNSAFECODE ON}是什么意思,怎么改啊,好象程序没有错误,是要配置什么吧 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 在声明之前加上{$UNSAFECODE ON}但最后你要确保你的代码是安全的,还是要将不安全的代码替换掉 [Error] mainfrm.pas(73): Unsafe code only allowed in unsafe procedureprocedure 怎么加unsafe啊 麻烦楼上了,我是个新手,能不能向.net里设置debug里的可以使用不安全代码那样设置一下呢,我用的是delphi8,如果用delphi6是不是就不会有这样的问题了呢,下面是我的代码,能帮我看看吗,我不知道怎样在“类声明”前加unsafe ,我的语法不熟悉。 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. 在项目管理器中,将UNSAFE提示关掉就可以了,不用管它 project->options->compiler messages是这里吧,我去掉了,那个好象只是提示。 楼主用的一定是Delphi 。NET .NET里面通过不安全代码确实可以使用指针.但是你兺鞥分配内存而且使用指针的时候还要,声明成Unsafe的.而且也要打开Unsafe编译开关如下{$UNSAFECODE ON}procedure A;unsafe;.........procedure A;unsafe;begin 这里面才可以使用指针,但是.NET里面使用指针还是受到限制的.就是兺鞥分配内存 只能指向现有的数据end;{$UNSAFECODE OFF} File not found 'scExcelExport.dcu' 各位大牛有时间过来看看这个问题! 如何指定循环次数 如何将窗体贴着任务栏 请问:在Delphi中DXDraw控件配合TTimer控件(非TDXTimer)结果如何? Strlen 和 length的区别 怎么将汉字转换成汉语拼音? 这么简单的动态链接库为何就是会调用失败??有源码 关于Delphi对象没有释放导致内存泄漏的讨论,发言者有分!帮忙up! 怎么样做网络监视的程序???急~~~~~~~~~~~,15分呀, c/s开发可否替代B/S开发 delphi如何接收别的程序发过来的自定义的消息
procedure 怎么加unsafe啊
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.
是这里吧,我去掉了,那个好象只是提示。
.NET里面通过不安全代码确实可以使用指针.但是你兺鞥分配内存
而且使用指针的时候还要,声明成Unsafe的.而且也要打开Unsafe编译开关
如下
{$UNSAFECODE ON}
procedure A;unsafe;
.........
procedure A;unsafe;
begin
这里面才可以使用指针,但是.NET里面使用指针还是受到限制的.就是兺鞥分配内存
只能指向现有的数据
end;
{$UNSAFECODE OFF}