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
Wie kann ich AudioGenie3.dll einbinden
Loki2020
myCSharp.de - Member



Dabei seit:
Beiträge: 3

Themenstarter:

Wie kann ich AudioGenie3.dll einbinden

beantworten | zitieren | melden

Hallo Comunity,
Ich beisse mir bei folgendem Problem die Zähne aus:
In Excel 365 benutzte ich zum Auslesen von MP3-Dateien die super funktionierende AudioGenie3.dll. Gerne würde ich diese DLL auch unter C# nutzen, weiss aber nicht wie. Folgenden Ansatz habe ich bisher:


using System;
using System.Runtime.InteropServices;

namespace MyMP3
{
    class ID3Bearbeiten
    {

        [DllImport("AudioGenie3.dll")]
        public static extern int AUDIOAnalyzeFileW(UIntPtr Filename);    // ? ist das so richtig
       
        public int AUDIOAnalyseFile(string FileName)
        {
            int Ergebnis = AUDIOAnalyzeFileW(????);     // Hier ist das Problem, wie übergebe ich den unten aufgeführten Variablentyp
            return Ergebnis;
        }


        public void ID3Lesen(string strDatei)
        { 
            string strDatei = "D:\\Deep Purple _ Lucifer.mp3";
            int IntVorhanden = AUDIOAnalyseFile(strDatei); 
        }
    }
}

Die Doku zur DLL besagt folgendes:
Int16 AUDIOAnayzeFileW(LPCWSTR Filename)

Datentyp Bezeichner Beschreibung
LPCWSTR FileName Name der Datei

Datentyp Beschreibung
LPCWSTR ein Zeiger auf ein Textfeld mit 16bit Unicode Zeichen (UTF-16) terminiert von $0 $0

Als Beispiel ist angegeben: result = AUDIOAnalyzeFileW(FileName)
was nicht ganz richtig ist, denn in Excel-VBA rufe ich auf: result = AUDIOAnalyzeFile (FileName)


In Excel funktioniert ein VB6 Wrapper:
Private Declare PtrSafe Function AUDIOAnalyzeFileW Lib "AudioGenie3.dll" (ByVal FileName As LongPtr) As Integer


Public Function AUDIOAnalyzeFile(ByVal FileName As String) As Integer
    AUDIOAnalyzeFile = AUDIOAnalyzeFileW(StrPtr(FileName))
End Function


Falls folgende Angaben noch wichtig sind:
Ich nutze Windows 10 , 64Bit und Office 365

Moderationshinweis von Abt (04.02.2022 - 21:45)

Beitrag korrekt formatiert.

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



Dabei seit:
Beiträge: 420
Herkunft: Kassel

beantworten | zitieren | melden

Alles in Code Tags zu schreiben ist nicht so angenehm zu lesen

Siehst du den Unterschied zwischen Doku und deiner Implementierung? Du willst einen UInt-Pointer übergeben, erwartet wird ein LPCWSTR. Ein Int16 ist ein short in C#.
private Nachricht | Beiträge des Benutzers
Th69
myCSharp.de - Experte

Avatar #avatar-2578.jpg


Dabei seit:
Beiträge: 4.320

beantworten | zitieren | melden

Hallo Loki2020,

hast du schon in Marshallen von Daten mit Plattformaufruf geschaut?
Du kannst also für LPCWSTR einfach String (oder StringBuilder) benutzen (und wegen dem W (Widestring) noch Unicode setzen):


[DllImport("AudioGenie3.dll", CharSet=CharSet.Unicode)]
public static extern int AUDIOAnalyzeFileW(string Filename);
private Nachricht | Beiträge des Benutzers
Loki2020
myCSharp.de - Member



Dabei seit:
Beiträge: 3

Themenstarter:

beantworten | zitieren | melden

Hallo TH69,
vielen Dank für deinen Hinweis. Ich habe meinen Code geändert in:

public static extern int AUDIOAnalyzeFileW([MarshalAs(UnmanagedType.LPWStr)] string Filename);

aber es kommt weiterhin eine Fehlermeldung
Fehler
System.BadImageFormatException: "Es wurde versucht, eine Datei mit einem falschen Format zu laden. (Ausnahme von HRESULT: 0x8007000B)"


Da ich nicht so firm in C# bin, werde ich wohl weiter mit VBA arbeiten müssen, da hier die DLL ohne Probleme funktioniert.
private Nachricht | Beiträge des Benutzers
T-Virus
myCSharp.de - Member



Dabei seit:
Beiträge: 1.965
Herkunft: Nordhausen, Nörten-Hardenberg

beantworten | zitieren | melden

Klingt nach falschen Format (32/64 Bit) bzw. steht deine Anwendung auf Any CPU.
Wenn du Platformspezifische DLLs einbindest, muss deine Anwendung auch für die jeweilge Platform kompiliert sein.
Entpsrechend musst du einfach nur x86/x64 auswählen, dann sollte es direkt laufen.

T-Virus
Developer, Developer, Developer, Developer....

99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.
private Nachricht | Beiträge des Benutzers
Loki2020
myCSharp.de - Member



Dabei seit:
Beiträge: 3

Themenstarter:

beantworten | zitieren | melden

Hallo T-Virus,

danke für den Hinweis! Es funktioniert jetzt. Ich habe die Plattform auf x64 umgestellt.

Gruß Loki2020
private Nachricht | Beiträge des Benutzers