![]() |
Copy eines record (lokal) kein .NET ...Delphi Win32
Habe da ein problem in verbindung mit Net..
Anscheinend kann man innerhalb Net wenn man einen pointer auf einen record übergibt die Daten nicht im Speicher halten. Ich vertraue darauf, dass alle Parameter quasi als Pointer im Speicher auch noch nach dem Aufruf existieren, damit man darauf zugreifen kann. Dies ist bei .Net allerdings leider nicht gegeben, da alle Parameter im Speicher immer nur während der Dauer des Funktions-Aufrufen im Speicher fixiert sind. Danach kann der Garbage Collector diese ggf. im Speicher verschieben. Wenn das passiert ich aber 'nur' den Pointer gemerkt habe, kommt es zu einer Exception. Nun die Frage wie eine lokale Kopie erstellen bevor die Daten übergeben werden ?? gruss Emil |
Re: Copy eines record (lokal)
Was genau willst du denn mit dem Record anstellen?
PS: Pointer führen das Konzept der Gargabe Collection ad absurdum und sollten daher wo auch nur möglich nicht verwendet werden... |
Re: Copy eines record (lokal)
.Net und Pointer?
|
Re: Copy eines record (lokal)
Zitat:
Delphi .. DLL
Delphi-Quellcode:
VisInfo : TBASSVIS_INFO;
PBASSVIS_INFO = ^TBASSVIS_INFO;
TBASSVIS_INFO = record SongTitle : PChar; // Titel mit vorstehener TitelNr ('1. ') Songfile : PChar; // SongTitel incl. Pfad pos : DWORD; // 1000 * Aktuelle Position im Stream len : DWORD; // Stream länge PlaylistPos : DWORD; // Playlist Position Playlistlen : DWORD; // Playlist einträge SampleRate : integer; // SämpleRate BitRate : integer; // BitRate Duration : DWORD; // abgelaufen Zeit Channels : integer; // Kanäle default 2 (stereo) end; So bei der übergabe von @VisInfo scheint innerhalb des Speichers in NET der Pointer auf den record VisInfo verschoben zu werden Deshalb hat man mir geraten davon eine lokale kopie zu erstellen.. nur Wie ? gruss Emil |
Re: Copy eines record (lokal)
kannst du bitte in deinen titel .NET angeben...
das ist keine allgemeine pascal frage, sondern M$ implementation... ... und von dieser hab ich keine ahnung. du wirst viel besere antworten bekommen, wenn du das auch richtig betiteln kannst... grüss und noch 'n schönen abend |
Re: Copy eines record (lokal)
Zitat:
Also bitte erst lesen und wie ich meinen Thread betiteln muss werd ich schon wissen ... aber danke ;) Meine DLL ist in Delphi geschrieben also Delphi ;) Wenn aber jemand diese in NET verwendet und dort der übergebene Pointer verbogen wird muss ich mir also in Delphi etwas ausdenken um das zu vermeiden oder ? Schließlich ist die DLL nicht mit NET erstellt sonder mit Delphi 2006 Meine Frage also nochmal ! Muss ich jetzt eine Kopie von meinen Record in Delphi erstellen und alles was reinkommen darauf verbiegen ? Oder wie sonst eine lokale Kopie erstellen. gruss .. auch noch einen schönen Abend. |
Re: Copy eines record (lokal) kein .NET ...Delphi Win32
Im moment fällt mir nur diese lösung ein
Delphi-Quellcode:
Theoretisch habe ich nun ein Speicherabbild des Record TBASSVIS_INFO
Type
PBASSVIS_INFO = ^TBASSVIS_INFO; TBASSVIS_INFO = record SongTitle : PChar; // Titel mit vorstehener TitelNr ('1. ') Songfile : PChar; // SongTitel incl. Pfad pos : DWORD; // 1000 * Aktuelle Position im Stream len : DWORD; // Stream länge PlaylistPos : DWORD; // Playlist Position Playlistlen : DWORD; // Playlist einträge SampleRate : integer; // SämpleRate BitRate : integer; // BitRate Duration : DWORD; // abgelaufen Zeit Channels : integer; // Kanäle default 2 (stereo) end; var MyInfo : PBASSVIS_INFO; function BASSVIS_SetInfo(Param: PBASSVIS_PARAM; Infos: PBASSVIS_INFO): BOOL; stdcall; begin // ab jetzt innerhalb der anwendung nur noch mit MyInfo weiterarbeiten MyInfo := @Infos; end; Damit würde ich die Daten immer noch an der richtigen adresse im speicher halten selbst wenn in .NET der Zeiger auf den speicherbereich verbogen oder dieser freigegeben wird. weiß aber nicht ob man das so einfach bewerkstelligen kann. gruss |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:25 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