Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Object Pascal: кроссплатформенные технологии > Небезопасный код в Delphi Explorer for .Net


Автор: Griznoff 18.3.2008, 15:11
Начал переводить приложение, написанное на Delphi Explorer, на Delphi Explorer for .Net.
Просто открыл проект (думаю, вдруг так пойдёт smile ), жму запустить, пишет [Pascal Error] Service.pas(72): E2410 Unsafe pointer variables, parameters or consts only allowed in unsafe procedure.

Строка, где появилась ошибка: procedure StringToStream(Value: PChar; Length: Integer; Stream: TMemoryStream);

Куда копать?
Я надеюсь указатели в .Net можно использовать, а то их меня в проге куча? smile 

Автор: Snowy 18.3.2008, 15:28
PChar - указатель.
Все операции с указателями являются небезопасными.
Также в .NET нельзя использовать строку в качестве буфера.

Автор: Griznoff 19.3.2008, 12:27
Snowy, то есть вообще чтоли указатели использовать нельзя? smile 

Я на англоязычных сайтах видел, что можно использовать диррективу для компилятора, которая позволяет небезопасный код.....но что-то не получилось её использовать...может как-то не так использовал (просто вставил директиву в секцию деклараций)?

Но мне как-то кажется кривым этот путь.....как без указателей-то кодировать???

Автор: Exai1e 19.3.2008, 21:44
Griznoff, дык в шарпе тоже нет указателей) и ничего люди както умудряются программировать smile

Автор: kemiisto 22.3.2008, 10:54
Использовать указатели можно в любом .NET языке. Для этого надо уведомить компилятор о разрешении работы с небезобасным кодом (unsafe code). В Delphi for .NET для этого необходимо:
  • в модуль, содержащий небезопасный код, включить директиву {$UNSAFECODE ON};
  • функции с небезопасным кодом пометить ключевым словом unsafe.
 
Вот небольшой пример:
Код

program Project1;

{$APPTYPE CONSOLE}
{$UNSAFECODE ON}

{%DelphiDotNetAssemblyCompiler '$(SystemRoot)\microsoft.net\framework\v1.1.4322\System.Windows.Forms.dll'}

uses
  SysUtils,
  System.Windows.Forms;

procedure UsingPointers; unsafe;
var
  A: array[0..31] of Char;
  P: PChar;
begin
  A := 'delphi rocks!';
  P := @A;
  P[0] := 'D';
  MessageBox.Show(A);
end;  

begin
  UsingPointers;
end.

Однако надо учитывать, что 
Цитата(Ксавье Пачеко @  Delphi for .NET Руководство разработчика)

Небезопасный код абсолютно неприемлим в среде .NET, поскольку небезопасное приложение не подлежит осмотру инструментом .NET PEVerify, а следовательно, может быть запрещено системой безопасности. Однако небезопасный код может оказаться полезен при переходе от платформы Win32 к пплатформе .NET, ведь достаточно большое приложение Win32 будет весьма сложно перевести на платформу .NET сразу. Таким образом, возможность применения небезопасного кода позволит переводить приложение по частям, оставляя прежний код небезопасным до тех пор, пока все приложение не будет полностью переведено на безопасный код.

Автор: Griznoff 23.3.2008, 16:49
kemiisto, спасибо, мне как раз для постепенного перехода и надо.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)