Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Unmanaged DLL in C# - Problem
cs3000
myCSharp.de - Member



Dabei seit:
Beiträge: 26
Herkunft: Österreich

Themenstarter:

Unmanaged DLL in C# - Problem

beantworten | zitieren | melden

Ich habe noch nie Dlls in mein Programm selbst eingebunden, ich habe es immer nur gesehen bei fertigen Programmteilen, jetzt gibt es aber keine andere Möglichkeit, da die Beispielprojekte für die Dll nur in C oder VB sind.
Zum Glück ist alles gut dokumentiert, also habe ich einmal selbst herumprobiert. Leider funktioniert nicht alles so wie es sein sollte, darum bitte ich euch im Hilfe:

Die Dll dient dazu um .mod-Dateien abzuspielen, um diese abzuspielen, muss man zuerst "BASSMOD_Init", dann "BASSMOD_MusicLoad" und danach "BASSMOD_MusicPlay" ausführen. Hier die Doku:

BOOL WINAPI BASSMOD_Init(
    int device,
    DWORD freq,
    DWORD flags
);

BOOL WINAPI BASSMOD_MusicLoad(
    BOOL mem,
    void *file,
    DWORD offset,
    DWORD length,
    DWORD flags
);

mem TRUE = load the MOD music from memory.
file Filename (mem = FALSE) or a memory location (mem = TRUE).
offset File offset to load the MOD music from (only used if mem = FALSE).
length Data length... 0 = use all data up to the end of file. If length over-runs the end of the file, it'll automatically be lowered to the end of the file.
flags BASS_MUSIC_LOOP Loop the music.

BOOL WINAPI BASSMOD_MusicPlay();

Ich habe die 3 Aufrufe so gelöst:

(Namespace System.Runtime.InteropService)

[DllImport("BASSMOD.dll")]
        private static extern bool BASSMOD_Init(
            int device,
            string freq,
            string flags
        );

        [DllImport("BASSMOD.dll")]
        private static extern bool BASSMOD_MusicLoad(
            bool mem,
            string file,
            string offset,
            string length,
            string flags
        );

        [DllImport("BASSMOD.dll")]
        private static extern bool BASSMOD_MusicPlay();

public void InitAndPlay()
        {
            BASSMOD_Init(-1, "44100", "0");
            BASSMOD_MusicLoad(false, "moontrip.mod", "0", "0", "BASS_MUSIC_LOOP");
            BASSMOD_MusicPlay();
        }

Initialisieren läuft ohne Probleme und gibt true zurück, aber bei MusicLoad scheitert es, MusicPlay dürfte danach kein Problem mehr sein.
Was habe ich falsch gemacht?
Greetings

cs3000
private Nachricht | Beiträge des Benutzers
maxE
myCSharp.de - Member



Dabei seit:
Beiträge: 456
Herkunft: Sachsen

beantworten | zitieren | melden

Schon mal daran gedacht, dass string und DWORD nicht kompatiblel sind?
I am Jack's smirking revenge.
I am Jack's raging bile duct.
I am Jack's cold sweat.
I am Jack's complete lack of surprise.
I am Jack's broken heart.
I am Jack's wasted life.
private Nachricht | Beiträge des Benutzers
talla
myCSharp.de - Experte

Avatar #avatar-3214.jpg


Dabei seit:
Beiträge: 7290
Herkunft: Esslingen

beantworten | zitieren | melden

Nen DWord ist normal nen 32 Bit Integer, sprich in .Net nen einfacher int und kein String. Wundert mich dass das initialisieren damit klappen soll.

Auch bei dem string für den void Pointer bin ich mir net ganz sicher. Denke für Dateinamen könnte das funktionieren, aber da er generell auch Speicheradresen annimmt laut Beschreibung ist der string Parameter bestimmt zu speziell und du müsstest auch in .Net nen Pointer verwenden. Aber da bin ich mir net hundertprozentig sicher, beim ersten dagegen schon.
Baka wa shinanakya naoranai.

Mein XING Profil.
private Nachricht | Beiträge des Benutzers
maxE
myCSharp.de - Member



Dabei seit:
Beiträge: 456
Herkunft: Sachsen

beantworten | zitieren | melden

Genau genommen ist ein DWORD sogar ein uint

Auch solltest du ein Flag nicht einfach als String übergeben. Das wird Brühe. Du muss die genaue Flag-Definition schon aus dem BASS Header nehmen und auf C# umschreiben.
I am Jack's smirking revenge.
I am Jack's raging bile duct.
I am Jack's cold sweat.
I am Jack's complete lack of surprise.
I am Jack's broken heart.
I am Jack's wasted life.
private Nachricht | Beiträge des Benutzers
cs3000
myCSharp.de - Member



Dabei seit:
Beiträge: 26
Herkunft: Österreich

Themenstarter:

beantworten | zitieren | melden

Ich habe jetzt alle strings auf uint umgedreht und die flag ebenfalls und nun hat es auf Anhieb funktioniert. Ich dachte, dass DWORD etwas mit wort und daher am ehesten mit string zutun hat ^^.
Hier nocheinmal für alle die es interessiert:

Die Dll + Samples (Samples sind nicht für C#)
Bassmod
Mit einem Mod-Player kann man die alten Musikfiles abspielen, die man früher bei den Computerspielen verwendet hat, bevor man auf mp3 umgestiegen ist.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;

namespace MOD_Player
{
    public class Form1 : Form
    {
        [DllImport("BASSMOD.dll")]
        private static extern bool BASSMOD_Init(
            int device,
            uint freq,
            uint flags
        );

        [DllImport("BASSMOD.dll")]
        private static extern bool BASSMOD_MusicLoad(
            bool mem,
            string file,
            uint offset,
            uint length,
            uint flags
        );

        [DllImport("BASSMOD.dll")]
        private static extern bool BASSMOD_MusicPlay();

        [DllImport("BASSMOD.dll")]
        private static extern bool BASSMOD_MusicStop();

        [DllImport("BASSMOD.dll")]
        private static extern bool BASSMOD_Free();

        public Form1()
        {
            InitAndPlay();
            InitializeComponent();
        }
        public void InitAndPlay()
        {
            BASSMOD_Init(-1, 44100, 0);
            BASSMOD_MusicLoad(false, "moontrip.mod", 0, 0, 0);
            BASSMOD_MusicPlay();
        }
        private void InitializeComponent()
        {
            this.FormClosing += new FormClosingEventHandler(Form1_FormClosing);
        }

        void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            BASSMOD_MusicStop();
            BASSMOD_Free();
        }

        [STAThread]
        static void Main()
        {
            Application.Run(new Form1());
        }
    }
}
Greetings

cs3000
private Nachricht | Beiträge des Benutzers
talla
myCSharp.de - Experte

Avatar #avatar-3214.jpg


Dabei seit:
Beiträge: 7290
Herkunft: Esslingen

beantworten | zitieren | melden

Zitat
Original von cs3000
Ich dachte, dass DWORD etwas mit wort und daher am ehesten mit string zutun hat ^^.

Auch wenn die Schlussfolgerung net ganz korrekt war, find ichs aber gut das du dir dazu Gedanken gemacht hast

In der Tat hat DWORD sogar mehrere Bedeutungen, je nachdem für welche Hardware man programmiert.

Nen WORD ist erstmal die Busbreite eines Systems, früher 16 Bit, jetzt 32 Bit und in naher Zukunft wohl verbreitet 64 Bit. Das sagt die theoretische Digitaltechnik und gilt für PCs. Bei PowerPCs z.b. ist ein Word 32Bit lang.

Aufgrund besserer Vergleichbarkeit unabhängig von der dadrunterliegenden Hardware hat sich aber eingebürgert dass ein WORD immer 16 Bit sind(historisch bedingt) Nen D(ouble)WORD sind dann 32 Bit und nen Q(uad)WORD 64 Bit. Das gilt aber auch nur für PCs und vielen µC. Bei PowerPCs sind 16 Bit nen H(alf)Word, 32 Bit nen Word usw.

Denke auch das sich das in Zukunft aber irgendwie ändern wird die Bezeichnung. Die stammen immerhin aus der Zeit der 16Bitter und da waren 64 Bit als QWord noch viel. Heute ist das schon die Grundbreite und weiß grad net wie man 256Bit als QWORD von einem 64 Bit WORD aus der Sicht von 16 Bit als WORD nennen würde

Überhaupt die Breite des Systems als Datentyp zu benutzen ist auch noch aus der Zeit wo die Sprachen keine feste Breite der Datentypen kannten. C und C++ kennen die ja selbst heute noch net wirklich und es sind bloß Grenzen vorgeschrieben wo die drin sein müssen. Ob nen Int jetzt 2, 4 oder 8 Byte ist, ist in C++ net vorgeschrieben, in C# dagegen schon Da sinds 4 Byte, auch auf anderen Plattformen(rein theoretisch =))

Achja, an sich hat maxE mit dem uint Recht, so wird interpretiert um die großtmögliche Zahl anzugeben die man mit einem mal verarbeiten kann. Aber an sich sagt des noch nichts drüber aus ob nun die Daten unsigned oder signed interpretiert werden. Das ist auch eher wieder so ne stille Konvention wie oben mit den 16 Bit WORD, dass des immer unsigned sein soll.
Baka wa shinanakya naoranai.

Mein XING Profil.
private Nachricht | Beiträge des Benutzers