Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   VB_NET Parameter zuweisen (https://www.delphipraxis.net/144693-vb_net-parameter-zuweisen.html)

EWeiss 14. Dez 2009 22:33

Re: VB_NET Parameter zuweisen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Dann hast du in den Projektoptionen unter "Build" "anyCPU" als CPU-Plattform stehen.
Da deine DLL aber in Delphi geschrieben ist, und wir hier (nur) von Windows reden, wird sie wohl nur von einem 32Bit Prozess aus geladen werden können.
AnyCPU heißt, dass der JIT-Compiler die Anwendung auf einem x64 System mit 64Bits, auf einem 32Bit-System mit 32Bit erzeugen wird.
Wenn du dort x86 einträgst, ist es immer 32Bit und wird einfach gehen.
Nein ich habe dort x86 eingetragen nicht AnyCPU das mag VB.NET gar nicht wenn da was nicht stimmt
und quittiert das mit einen Fehler.

Zitat:

Was du willst, ist eine Classlibrary anlegen, die deine DLL vernünftig verpackt.
Also wohl nicht nur die Funktionen importiert, weil dass können die Devs einfach selbst.
Sondern diese Imports vernünftig in hübsche Klassen verpacken.
Und mit solchen Konstanten braucht man in .Net gar nicht anfangen. Unterstriche sind in den .Net API Guidelines mehr als nur ungern gesehen. Und numerische Konstanten löst man mit Enums. (wie du es ja in Delphi auch hast)
Du hast doch die API für Delphi oben gesehen diese verwende ich in irgendeinen Delphi Projekt(Anwendung) um mit meiner DLL zu kommunizieren
Nichts anderes soll die API für VB.NET machen.

Zitat:

Was du willst, ist eine Classlibrary anlegen, die deine DLL vernünftig verpackt
Ich weiss nicht was du damit meinst . Sorry
Ich mache doch nichts anderes als die Exports meiner DLL in eine Classe zu packen damit man von VB.NET auf diese zugreifen kann.

Etwas Konfus das ganze für mich.

gruss Emil

EWeiss 15. Dez 2009 04:33

Re: VB_NET Parameter zuweisen
 
Ok ich hab jetzt eine Managed DLL geschrieben wo man mit VB.NET und C# draufzugreifen kann.
Ist nicht das was ich wollte nur für die API eine zusätzliche DLL zu verwenden aber erst mal egal.. ;)

Hab jetzt aber ein Probelm ..
Code:
       
[DllImport("bass_vis.dll", EntryPoint="BASSVIS_Free", CharSet=CharSet.Auto)]
public static extern bool BASSVIS_Free(BASSVIS_PARAM param, BASSVIS_PARAM mbase);
Code:
namespace BassVis_Api
{
    using System;
    using System.Runtime.InteropServices;

    [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;
        }
    }
}
Mein Aufruf
Code:
BassVis.BASSVIS_Free(mVisParam, mBase);
Ich übergebe nach dem start des Plugin mBase.Vishandle das Handle von mVisParam.VisHandle
Wenn der Visualisierungthread in BassVis beendet ist setze ich mBase auf 0

So kann man gegenprüfen ob die Plugins entladen und das Handle = 0 ist.

Jetzt meldet mir C# das mBase immer null ergibt
Was muss ich machen bzw.. verlinken damit C# erkennt das ein wert zurückgegeben wird auch wenn er nur 0 ist.

Zitat:

Dem Feld "BassVisExample.Form1.mBase" wird nie etwas zugewiesen, und es hat immer seinen Standardwert von "null".
Ich weise aber mBase doch ein Handle zu wie kann das dann null sein.

Irgenwie aktzeptiert er nicht das ich zwei Parameter des gleichen Typs in einer Funktion habe.
Code:
private BASSVIS_PARAM mVisParam;
private BASSVIS_PARAM mBase;
gruss Emil

jfheins 15. Dez 2009 10:00

Re: VB_NET Parameter zuweisen
 
Erstmal fällt mir auch, dass du eine Klasse deklariert hast (soweit ich den VB Code da oben lesen kann, war's da ein struct)

Dann: Oben hast du ein byref stehen - das musst du in C# auch extra angeben (ref Schlüsselwort). Wobei das hier fast keinen Unterschied macht, da es ja eine Klasse ist.

Was mir jetzt so aufgefallen ist :stupid:

EWeiss 15. Dez 2009 11:17

Re: VB_NET Parameter zuweisen
 
Zitat:

Zitat von jfheins
Erstmal fällt mir auch, dass du eine Klasse deklariert hast (soweit ich den VB Code da oben lesen kann, war's da ein struct)

Dann: Oben hast du ein byref stehen - das musst du in C# auch extra angeben (ref Schlüsselwort). Wobei das hier fast keinen Unterschied macht, da es ja eine Klasse ist.

Was mir jetzt so aufgefallen ist :stupid:

Mit dem ref dürfte das gehn..
Allerdings nur bei mBase

Freigeben
Code:
if (mVisParam.VisHandle != 0)
{
    BassVis.BASSVIS_Free(mVisParam, ref mBase);
    mBase = new BASSVIS_PARAM(mVisParam.Kind);
    mVisParam.VisHandle = mBase.VisHandle;
}
Neues Handle übergeben
Code:
mBase = new BASSVIS_PARAM(mVisParam.Kind, mVisParam.VisHandle);

Danke.

gruss Emil


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:16 Uhr.
Seite 2 von 2     12   

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 by Thomas Breitkreuz