![]() |
AV bei umwandlung PAnsiChar nach C#
Fehler!
Zitat:
C#
Code:
[Serializable, StructLayout(LayoutKind.Sequential)]
public sealed class BASSVIS_INFO { [MarshalAs(UnmanagedType.LPStr)] public string SongTitle = string.Empty; [MarshalAs(UnmanagedType.LPStr)] public string SongFile = string.Empty; public int Position; public int PlaylistPos = 1; public int PlaylistLen = 1; public int SampleRate = 0xac44; public int BitRate = 0x100; public int Duration; public int Channels = 2; public BASSVIS_INFO(string songtitle, string filename) { } }
Code:
//BASSVIS_SetInfo
[return: MarshalAs(UnmanagedType.Bool)] [DllImport("bass_vis.dll", EntryPoint = "BASSVIS_SetInfo", CharSet = CharSet.Auto)] public static extern bool BASSVIS_SetInfo(BASSVIS_PARAM param, BASSVIS_INFO info);
Code:
if ((_visParam.VisHandle != 0) & (BassVisTest.MainWindow._streamFile != ""))
BassVis.BASSVIS_SetInfo(_visParam, _mediaInfo);
Delphi-Quellcode:
Liegt hier ein Konvertierungs Problem zwischen PAnsiChar und WideString vor?
procedure TBassWMPVisAPI.WMPVIS_SetMediaInfo(Channels: integer; SampleRate: integer;
Title: PAnsiChar; FileName: PAnsiChar); stdcall; var WMPMedia: IWMPMedia; begin if RenderFromDevice then Title := 'BassVis - BrewIdeas©Emil Weiss'; if OldMedia <> WideString(FileName) then begin if FileExists(string(FileName)) then begin OldMedia := WideString(FileName); BassWMPVis1.FStreamInfo.SampleRate := SampleRate; BassWMPVis1.FStreamInfo.Channels := Channels; BassWMPVis1.FStreamInfo.Title := WideString(Title); BassWMPVis1.FStreamInfo.FileName := FileName; WMPHelper.MediaInfo(Channels, SampleRate, WideString(Title)); Oder woher kommt der Fehler. Es kracht hier..
Delphi-Quellcode:
gruss
function TWMPHelper.NotifyNewMedia(pMedia: IWMPMedia): Bool;
begin Result := False; try EnterCriticalSection(CritSect); if Assigned(_IWmpEffects2) then if _IWmpEffects2.NotifyNewMedia(pMedia) = S_OK then //<<<<< Problem nur in C# Result := True; finally LeaveCriticalSection(CritSect); end; end; |
AW: AV bei umwandlung PAnsiChar nach C#
Hallo Emil,
so recht weiß ich nicht welches Problem Du hast (ok, da läuft wohl ein pointer Amok) aber ich würde mich nicht auf irgendwelche wilde typecasting Möglichkeiten verlassen sondern mit den richtigen Typen arbeiten also etwa so:
Delphi-Quellcode:
Woher kommen eigentlich OldMedia und Title ??
procedure TBassWMPVisAPI.WMPVIS_SetMediaInfo(Channels: integer; SampleRate: integer;
Title: PAnsiChar; FileName: PAnsiChar); stdcall; var WMPMedia: IWMPMedia; wFilename: widestring; wOldmedia: widestring; wTitle : widestring; begin wFilename:=Filename; wTitle:=Title; if RenderFromDevice then Title := 'BassVis - BrewIdeas©Emil Weiss'; if OldMedia <> wFileName then begin if FileExists(string(FileName)) then //------ was für ein Delphi ??? 16/8Bit String/Char??? begin OldMedia := wFileName; Gruß K-H |
AW: AV bei umwandlung PAnsiChar nach C#
Kannst du dein Problem noch mal detaillierter schildern?
Versuchst du aus einer Anwendung, die mit C# geschrieben wurde auf die DLL, die mit Delphi geschrieben wurde zuzugreifen? Wie sieht
Code:
aus?
_IWmpEffects2
Schmeißt die Funktion in der DLL einen Fehler oder die C# Anwendung? Grüße! |
AW: AV bei umwandlung PAnsiChar nach C#
Zitat:
Wird da nur stumpf der "Pointer"/Typ gecastet, oder war der Compiler so schlau eine Funktion für den Cast den Daten-Inhalts einzubauen. Ausgehend von "normalen" String-Typen (vorallem die LongStrings und der ShortString), macht das der Compiler immer, aber bei "Pointern" als Quelle nicht immer. Bei PAnsiChar<>PWideChar kann er es auch garnicht machen und wirft da nur eine Warnung. Und bei Pointer <-> Ansi/Wide/UnicodeString wird der Typ nur blind gecastet, ohne den Inhalt anzupassen, den der Compiler den Daten-Typ eh nicht kennt. Nur bei LongStrings (AnsiString, UnicodeString) und WideString zum passenden PChar-Typen braucht der Inhalt nicht konvertiert zu werden. Tut Delphi aber dennoch, aber nur bezüglich der Leer-Strings, wo auf eine Dummy-Stringkonstante mit dem Inhalt #0#0 umgeleitet wird. |
AW: AV bei umwandlung PAnsiChar nach C#
Zitat:
Delphi-Quellcode:
Title: PAnsiChar;
OldMedia: WideString; // global definiert Zitat:
Zitat:
Wobei ich auch hier den cast machen muss bleibt dann eigentlich das selbe wie bei mir.
Delphi-Quellcode:
wFilename:=Filename;
wTitle:=Title;
Delphi-Quellcode:
wTitle := WideString(Title);
wFilename := WideString(FileName); Zitat:
Zitat:
Delphi-Quellcode:
//Called by Windows Media Player to inform the visualization that a new
//media item has been loaded. function NotifyNewMedia(pMedia : IWMPMedia): HRESULT; stdcall; Zitat:
Seltsam jedoch wenn ich direkt nach Plugin Execute die Funktion aufrufe unabhängig von den Casts
Delphi-Quellcode:
funktioniert es.
BassVis.BASSVIS_SetInfo(_visParam, _mediaInfo);
Aber nicht aus den Thread heraus, was aber wichtig ist um das Plugin zu informieren wenn ein neuer Titel abgespielt wird. gruss |
AW: AV bei umwandlung PAnsiChar nach C#
Ich habe es mittlerweile selbst behoben.
Es hat weniger mit den Konvertierungen zu tun sondern war ein Thread Problem. Einige Plugins mögen es scheinbar nicht wenn sie aus einen anderen Thread gestartet werden. Invoke hat das Problem beseitigt. Seltsam das es nur mit WMP Plugins Probleme gibt aber gut sei's drum.
Code:
Hat also nichts mit meiner DLL zu tun ausschließlich mit C#
System.Windows.Application.Current.Dispatcher.Invoke(() =>
{ _mediaInfo.SongTitle = BassVisTest.MainWindow._mediaTitle; _mediaInfo.SongFile = BassVisTest.MainWindow._streamFile; _mediaInfo.Channels = 2; _mediaInfo.SampleRate = 44100; BassVis.BASSVIS_SetInfo(_visParam, _mediaInfo); }); gruss |
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:09 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