![]() |
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:
Kann mir jmd auf die Sprünge helfen, was ich falsch mache?
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. |
Re: Pointer in unsafe code eriner VCL.Net-Anwendung
Ich denke beim new sollte man einen Pointer angeben. In diesem Fall ptest.
|
Re: Pointer in unsafe code eriner VCL.Net-Anwendung
Zitat:
Egal, ob ich new(test) new(pTest) new(^tTest) new(tTest) aufrufe, die Fehlermeldung bleibt die gleiche. |
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 |
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); |
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. |
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..... |
Re: Pointer in unsafe code eriner VCL.Net-Anwendung
Zitat:
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; |
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* |
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 02:44 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz