AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein C# Record/Struct rückgabe by ref/var
Thema durchsuchen
Ansicht
Themen-Optionen

Record/Struct rückgabe by ref/var

Ein Thema von EWeiss · begonnen am 22. Mai 2015 · letzter Beitrag vom 23. Mai 2015
Antwort Antwort
Seite 2 von 2     12   
Dejan Vu
(Gast)

n/a Beiträge
 
#11

AW: Record/Struct rückgabe by ref/var

  Alt 23. Mai 2015, 08:39
Bei Delphi ist das ein Rekord. Mit 'var' wird auf den Parameter per übergebener Referenz zugegriffen und Du kannst den Inhalt bearbeiten.

Bei C# wird die Referenz übergeben, weswegen das imho überhaupt erst funktioniert. Die Referenz an sich wird nicht verändert.

Wäre TBASSVIZ_PARAM eine Klasse, bräuchtest Du in Delphi das 'var' nicht, aber dann könntest Du von C# nicht drauf zugreifen.
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#12

AW: Record/Struct rückgabe by ref/var

  Alt 23. Mai 2015, 09:31
Zitat:
Bei Delphi ist das ein Rekord. Mit 'var' wird auf den Parameter per übergebener Referenz zugegriffen und Du kannst den Inhalt bearbeiten.
Ja das ist mir schon klar

Zitat:
Bei C# wird die Referenz übergeben, weswegen das imho überhaupt erst funktioniert. Die Referenz an sich wird nicht verändert.
An dieser aussage kann irgend etwas nicht stimmen..
Oder aber ich bin schlichtweg zu blöd dafür.

2 Kriterien die dagegen sprechen.

In meinen beiden Samples C# und VB_NET. Funktioniert es ohne übergabe aus meiner WrapperDLL.
Also.
WrapperDLL.
Code:
//BASSVIS_Free
[return: MarshalAs(UnmanagedType.Bool)]
[DllImport("bass_vis.dll", EntryPoint = "BASSVIS_Free", CharSet = CharSet.Auto)]
public static extern void BASSVIS_Free(BASSVIS_PARAM param);
Funktioniert also..
Aber nicht mit MediaPortal.

übergebe ich aus dem Wrapper bei "ref"
Code:
//BASSVIS_Free
[return: MarshalAs(UnmanagedType.Bool)]
[DllImport("bass_vis.dll", EntryPoint = "BASSVIS_Free", CharSet = CharSet.Auto)]
public static extern void BASSVIS_Free(ref BASSVIS_PARAM param);
funktionieren meine Samples nicht mehr.
MediaPortal sowieso nicht.
Weil ich Probleme habe dein Beispiel umzusetzen.
Es gibt da mehr als ein Interface in der ich das kapseln muss.

Warum also funktionieren meine Samples ohne Übergabe bei "ref" und mit dann nicht mehr ?
Natürlich habe ich dann die Funktionen in den Samples Angepasst.
Code:
BassVis.BASSVIS_Free(ref mVisParam);
bFree = mVisParam.VisHandle == 0;
bFree ist dann immer False weil das Handle > 0 (mit "ref") ohne ist es 0.

Kann es sein das es nicht ausreicht nur param by ref zurückzugeben?
Müsste ich speziell für den Fall noch selbst für die Rückgabe der Handles aus dem Wrapper sorgen?
Obwohl das eigentlich mir "ref" erledigt sein sollte.

Deshalb mein Einwand!

gruss

Geändert von EWeiss (23. Mai 2015 um 09:42 Uhr)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#13

AW: Record/Struct rückgabe by ref/var

  Alt 23. Mai 2015, 09:54
Vorher hatte ich eine Function zum prüfen ob das Handle 0 ist.
function BASSVIS_IsFree(Param: PBASSVIS_PARAM): BOOL; stdcall;

Diese wollte ich mir durch das bei "var" sparen.
Weil jegliche zusätzliche Export Funktion das Arbeiten mit der DLL unnötig verkompliziert.
Aber scheinbar geht es nicht ohne.

gruss
  Mit Zitat antworten Zitat
Dejan Vu
(Gast)

n/a Beiträge
 
#14

AW: Record/Struct rückgabe by ref/var

  Alt 23. Mai 2015, 12:11
Ich bin auch etwas verwirrt. Vielleicht habe ich auch etwas falsch verstanden. Könntest Du noch einmal genau wiedergeben, wie die Methode in der DLL deklariert ist, oder den Post zeigen, wo das erklärt ist.
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#15

AW: Record/Struct rückgabe by ref/var

  Alt 23. Mai 2015, 12:28
Ich bin auch etwas verwirrt. Vielleicht habe ich auch etwas falsch verstanden. Könntest Du noch einmal genau wiedergeben, wie die Methode in der DLL deklariert ist, oder den Post zeigen, wo das erklärt ist.
Gerne doch wenn es hilft.

Der Wrapper Schnittstelle zwischen BassVis.dll und der .NET Anwendung.
Damit User die VB_NET verwenden nicht so viel Probleme mit unmanaged code haben.
Zudem können beide .NET Environment dann diese eine DLL als reference zum Projekt hinzufügen.

Die Class BASSVIS_PARAM..
Code:
    [Serializable, StructLayout(LayoutKind.Sequential)]
    public sealed class BASSVIS_PARAM
    {
        public int VisHandle;
        public IntPtr VisGenWinHandle;
        public BASSVISKind Kind;
        public BASSVIS_PARAM(BASSVISKind kind)
        {
            this.Kind = kind;
            this.VisHandle = 0;
            this.VisGenWinHandle = IntPtr.Zero;
        }

        public BASSVIS_PARAM(BASSVISKind kind, int visHandle)
        {
            this.Kind = kind;
            this.VisHandle = visHandle;
            this.VisGenWinHandle = IntPtr.Zero;
        }
    }
und die external Funktion vom Export aus der BassVis.dll
Code:
//BASSVIS_Free
[return: MarshalAs(UnmanagedType.Bool)]
[DllImport("bass_vis.dll", EntryPoint = "BASSVIS_Free", CharSet = CharSet.Auto)]
public static extern void BASSVIS_Free(ref BASSVIS_PARAM param);
Der Record in BassVis.dll (Delphi Seite)
Delphi-Quellcode:
  PBASSVIS_PARAM = ^TBASSVIS_PARAM;
  TBASSVIS_PARAM = record
    VisHandle : HVIS; // VisHandle
    VisGenWinHandle : DWORD; // General Vis Window Handle W5
    Kind : TBASSVIS_KIND_T; // Aktive Plugin Art
  end;
die Funktion die exportiert wird.
procedure BASSVIS_Free(var Base: TBASSVIS_PARAM); stdcall;

gruss
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:28 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