Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Copy eines record (lokal) kein .NET ...Delphi Win32 (https://www.delphipraxis.net/105378-copy-eines-record-lokal-kein-net-delphi-win32.html)

EWeiss 20. Dez 2007 21:24


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

Dax 20. Dez 2007 21:33

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...

mkinzler 20. Dez 2007 21:43

Re: Copy eines record (lokal)
 
.Net und Pointer?

EWeiss 20. Dez 2007 21:51

Re: Copy eines record (lokal)
 
Zitat:

Zitat von mkinzler
.Net und Pointer?

Vielleicht etwas vergessen zur besseren verständigung...

Delphi .. DLL

Delphi-Quellcode:
  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;
VisInfo : TBASSVIS_INFO;

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

grenzgaenger 20. Dez 2007 22:34

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

EWeiss 20. Dez 2007 23:14

Re: Copy eines record (lokal)
 
Zitat:

Zitat von grenzgaenger
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

Denke mal das du etwas falsch auffaßt hier geht es ausschließlich um Delphi und um nichts anderes.
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.

EWeiss 21. Dez 2007 08:04

Re: Copy eines record (lokal) kein .NET ...Delphi Win32
 
Im moment fällt mir nur diese lösung ein

Delphi-Quellcode:
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;
Theoretisch habe ich nun ein Speicherabbild des Record TBASSVIS_INFO
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 19:33 Uhr.

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