Laden...

Wie kann ich AudioGenie3.dll einbinden

Erstellt von Loki2020 vor einem Jahr Letzter Beitrag vor einem Jahr 408 Views
L
Loki2020 Themenstarter:in
3 Beiträge seit 2022
vor einem Jahr
Wie kann ich AudioGenie3.dll einbinden

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

Hinweis von Abt vor einem Jahr

Beitrag korrekt formatiert.

P
438 Beiträge seit 2014
vor einem Jahr

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#.

4.685 Beiträge seit 2008
vor einem Jahr

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);

L
Loki2020 Themenstarter:in
3 Beiträge seit 2022
vor einem Jahr

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

Fehlermeldung:
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.

T
2.126 Beiträge seit 2008
vor einem Jahr

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.

L
Loki2020 Themenstarter:in
3 Beiträge seit 2022
vor einem Jahr

Hallo T-Virus,

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

Gruß Loki2020