![]() |
Record/Struct rückgabe by ref/var
Delphi
Delphi-Quellcode:
C#
PBASSVIS_PARAM = ^TBASSVIS_PARAM;
TBASSVIS_PARAM = record VisHandle : HVIS; VisGenWinHandle : DWORD; Kind : TBASSVIS_KIND_T; end;
Code:
Die procedure
[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; } } Delphi
Delphi-Quellcode:
C#
procedure BASSVIS_Free(
var Base: TBASSVIS_PARAM ); stdcall; external dllfile;
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); Meine Frage ist wie kann ich in C# by ref die Classe zurückgeben? In Delphi funktioniert das soweit alles.
Delphi-Quellcode:
procedure BASSVIS_Free(var Base: TBASSVIS_PARAM); stdcall;
Wurde das Plugin freigegeben dann setze ich die Handles auf 0.
Delphi-Quellcode:
Wie kann ich das jetzt in C# umsetzen?
Base.VisHandle := 0;
Base.VisGenWinHandle := 0; Ein einfaches
Code:
Sollte eigentlich funktionieren aber bei der Umsetzung in der Anwendung gibt es Probleme.
public static extern void BASSVIS_Free(ref BASSVIS_PARAM param);
Das würde theoretisch funktionieren.. (Zumindest wird kein Fehler angezeigt)
Code:
Das hingegen nicht..
BassVis.BASSVIS_Free(ref_visParam);
bool bFree = _visParam.VisHandle == 0; if (!bFree)
Code:
Error:
private IVisualization Viz = null;
//............... BassVis.BASSVIS_Free(ref Viz.VizParam); bool bFree = Viz.VizParam.VisHandle == 0; if (bFree) Zitat:
Code:
Nur hier kann ich kein "ref" übergeben.
public interface IVisualization
{ BassVis_Api.BASSVIS_PARAM VizParam { get; } gruss |
AW: Record/Struct rückgabe by ref/var
Seltsam ist nur das es auch ohne "ref" in normalen Anwendungen funktioniert. C# und VB_NET
Was bedeutet das die Handles auf 0 gesetzt sind wenn ich ein Plugin beende. Nur mit dem Mediaportal will das nicht obwohl es die gleichen Dateien (DLL's) sind. Sehr komisch das ganze. gruss |
AW: Record/Struct rückgabe by ref/var
Eine Property hat keine Adresse, deshalb wird das nicht gehen. Abhilfe:
a) Statt oder zusätzlich zur Property die Variable/Feld publizieren (Nicht so schön) b) Eine explizite Methode schreiben, die den Wert aus der DLL liest. Diese Methode hat dann Zugriff auf den privaten Backing Store der Property
Code:
Und deine DLL-Zugriffsklasse implementiert dann IBassVizDLLAccess.
Interface IBassVizDLLAccess
{ void BASSVIS_Free(ref parm); } class Foo : IVisualization { private BASSVIS_PARAM vizParam; public BASSVIS_PARAM VizParam {get {return vizParam;} } public void ReadViz (IBassVizDLLAccess BassViz) { BassVis.BASSVIS_Free(ref_vizParam); } } |
AW: Record/Struct rückgabe by ref/var
Du meins das würde reichen?
Code:
Seltsam bleibt jedoch warum in meinen samples für .NET alles auch ohne "ref" funktioniert.
public BASSVIS_PARAM VizParam {get {return vizParam;} }
Nur in Mepo halt nicht. Die WrapperDLL und die BassVisDLL sind gleich. Nicht das ich das Programm verwende aber es ärgert mich halt wenn etwas nicht so läuft wie man es eigentlich erwartet. Funktioniert leider nicht. Aber kein Problem ich vergesse MediaPortal ganz einfach. In meinen Samples funktioniert es ja. gruss |
AW: Record/Struct rückgabe by ref/var
Zitat:
|
AW: Record/Struct rückgabe by ref/var
Zitat:
So das ich es verstehe.. was damit gemeint ist. gruss |
AW: Record/Struct rückgabe by ref/var
C# und andere Spachen kapseln sogar einfache Typen, wie z.B. einen Integer, in je einem Objekt (bzw. sie können eventuell auch beide Modi)
Das ist z.B. ein Grund, warum JavaScript oder PHP in einer Variable "alles" halten können, ohne Diese typisieren zu müssen. (auch wenn man das intern "inzwischen" teilweise wieder "optimiert" und doch wieder versucht es nativ zu speichern, wenn es geht) Ein Delphi-Objekt wird ja auch immer per Referenz übergeben, selbst wenn man die Variable nicht als Referenz (VAR) übergibt. |
AW: Record/Struct rückgabe by ref/var
Erklärt aber noch nicht den Unterschied zwischen MePo C# und meinem Sample C# sowie dem in VB_NET
Warum meine Anwendungen Funktionieren aber die andere nicht. Ich kann mich ja nicht nach einer speziellen Anwendung richten sondern diese muss sich nach den Begebenheiten richten die meine Dll exportiert. Welche das sind habe ich ja aufgezeigt. Würde es also überall fehlschlagen hätte ich ein Design Problem aber dem ist ja nicht so. gruss |
AW: Record/Struct rückgabe by ref/var
Selber verstehen und vorallem machen kann ich es nicht ... bin froh, wenn ich's halbwegs lesen/entziffern kann.
Aber vielleicht erklärt das es ja ein bissl. ![]() ![]() ![]() ![]() ![]() |
AW: Record/Struct rückgabe by ref/var
Zitat:
Habe mich im World Wide Web schon umgesehen. Ich lasse es jetzt so wie es ist also ohne Rückgabe bei ref. Maßgeblich sind meine Samples da funktioniert es ja so wie es soll. Andere Anwendungen müssen sich halt die passende Lösung selber suchen. Das ist was ich zurückgebe und das ist korrekt.
Delphi-Quellcode:
gruss
procedure BASSVIS_Free(var Base: TBASSVIS_PARAM); stdcall;
//...... BASSVISKIND_WMP: begin BASSWMPVisAPI.WMPVIS_Free(Base.VisHandle); if BASSWMPVisAPI.WMPVIS_IsFree then begin Base.VisHandle := 0; Base.VisGenWinHandle := 0; end; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:23 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