Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Prism Pointer in unsafe code eriner VCL.Net-Anwendung (https://www.delphipraxis.net/49232-pointer-unsafe-code-eriner-vcl-net-anwendung.html)

Luke1410 7. Jul 2005 13:53


Pointer in unsafe code eriner VCL.Net-Anwendung
 
Beim Versuch folgenden VCL.Net Code mit Delphi 2005 zu compilieren bekomme ich in der markierten Zeile diesen Compilerfehler:[Error] Unit1.pas(34): E2307 NEW standard function expects a dynamic array type identifier

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs;
{$UNSAFECODE ON}
type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject); unsafe;
  private
    { Private declarations }
  public
    { Public declarations }
  end;

  pTest = ^tTest;
  tTest = record
     value1 : integer;
  end;

var
  Form1: TForm1;

implementation

{$R *.nfm}

procedure TForm1.FormCreate(Sender: TObject); unsafe;
var
   test : pTest;
begin
   test := new(tTest); // <- Zeile 34
end;

end.
Kann mir jmd auf die Sprünge helfen, was ich falsch mache?

Zettuu 7. Jul 2005 14:30

Re: Pointer in unsafe code eriner VCL.Net-Anwendung
 
Ich denke beim new sollte man einen Pointer angeben. In diesem Fall ptest.

Luke1410 7. Jul 2005 14:44

Re: Pointer in unsafe code eriner VCL.Net-Anwendung
 
Zitat:

Zitat von Zettuu
Ich denke beim new sollte man einen Pointer angeben. In diesem Fall ptest.

Das ist es leider nicht.
Egal, ob ich

new(test)
new(pTest)
new(^tTest)
new(tTest)

aufrufe, die Fehlermeldung bleibt die gleiche.

barf00s 7. Jul 2005 15:10

Re: Pointer in unsafe code eriner VCL.Net-Anwendung
 
dann mach den ganzen unsafe quark weg und benutz ne klasse

TTest = class
end;


var
xTest: TTest;


begin
xTest := TTest.Create;
...
FreeAndNil(xTest);
end;

wenn du schon .NET benutzt brauchst auch kein code der eventuell "unsafe" wäre

barf00s 7. Jul 2005 15:11

Re: Pointer in unsafe code eriner VCL.Net-Anwendung
 
btw erfolgt der aufruf von new nich über

var
x: PTest;

begin
x := New(PTest);
end;


sondern

New(x);

Luke1410 7. Jul 2005 15:32

Re: Pointer in unsafe code eriner VCL.Net-Anwendung
 
@new Aufruf: Hatte ich bereits versucht, ging aber auch nicht (siehe weiter oben).

Auf unsafed code zu verzichten würde das Problem sicherlich umgehen, ist in meinem Fall aber nicht möglich.

Es muss doch jemanden geben der schonmal den new-Aufruf in einer VCL.Net-Anwendung verwendet hat und mir sagen kann wo mein (Denk-)Fehler liegt.

barf00s 7. Jul 2005 15:47

Re: Pointer in unsafe code eriner VCL.Net-Anwendung
 
ich hab gedacht du verwendest New() so hier

t := new(ttest);
t := new(ptest);
t := new(^ttest);
...

New is ne Prozedur ...

andnernfalls könntest dus mal mit

var
x: PTest;

begin
GetMem(x, SizeOf(TTest));
...
FreeMem(x, SizeOf(TTest));
end;

versuchen.....

jbg 7. Jul 2005 15:51

Re: Pointer in unsafe code eriner VCL.Net-Anwendung
 
Zitat:

Zitat von Luke1410
mir sagen kann wo mein (Denk-)Fehler liegt.

Ganz einfach: New hat unter Delphi.NET eine andere Bedeutung als es die unter Win32 hat.
Ein New in Delphi.NET entspricht einem SetLength(dynArray, Dimension1 [, Dimension2, ...]);

Delphi-Quellcode:
var
  d: array of string;
begin
  New(d, 10);
  d[9] := 'Hallo';
end;

Robert_G 7. Jul 2005 15:58

Re: Pointer in unsafe code eriner VCL.Net-Anwendung
 
Was du da machst ist IMHO komplett "sinnbefreit".
Entweder managed mit max. ein paar P/Invokes, oder native.
Was versprichst du dir denn von einem VCL.Net.Win32.whatever - Cocktail? :gruebel:

btw: Value types (wie es ein record nunmal ist) sind in .Net nur dumme value types...
Die werden (fast) immer kopiert und sie dürfen auch nie nil sein.
Wenn du das (aus welchen Gründen auch immer) haben willst ist .Net die falsche Plattform...

*kopf schüttel*

Luke1410 7. Jul 2005 16:05

Re: Pointer in unsafe code eriner VCL.Net-Anwendung
 
@barf00s: Dachte GetMem und FreeMem wären komplett aus der VCL entfernt worden. Zumindest hab ich im Netz auf mehreren Seiten gelesen, dass eben diese Aufrufe durch entsprechende Aufrufe von new() und dispose() ersetzt werden sollten. Oder verwechsel ich da jetzt was???

@jbg: Thx, das erklärt schonmal die Fehlermeldung. Aber wie soll ich dann diesen alten Win32-Aufruf ersetzen? Oder geht das überhaupt nicht? Dann wär's doch aber recht sinnlos, Pointer weiterhin in unsafed code zu erlauben, wenn man gar keinen Speicher mehr reservieren kann.

@Robert_G: Was ich mir davon verspreche ist recht einfach erklärt: Ein vorhandenes größeres Win32-Projekt mit weniger als 6 Monaten arbeitsaufwand in ein .Net Projekt zu migrieren um dadurch die Sicherheitsfeatures von .net verwenden zu können und die Möglichkeit zu haben, Code auch in anderen Programmiersprachen einfach einzubinden inkl. der Nutzung der .Net-Assembly-Verwaltungsstruktur mit der Möglichkeit den Code später in safed Code zu konvertieren und in einem 3. Schritt dann in eine WinForms.Net-Anwendung umzuwandeln.

Sry, dass ich das nicht schon vorher geschrieben habe, aber bin eher der Auffassung nur das in Posts zu schreiben, was auch wichtig zur Lösung eines Problems ist und die Community nicht mit sinnlosen großen Codefragmenten vollzusammen und Romane über das Wieso und Warum zu schreiben (zumind. nicht, wenn man eine Lösung eines einfach zu beschreibenden Problems sucht :) ).


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:01 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz