AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein AV bei umwandlung PAnsiChar nach C#
Thema durchsuchen
Ansicht
Themen-Optionen

AV bei umwandlung PAnsiChar nach C#

Ein Thema von EWeiss · begonnen am 2. Jun 2016 · letzter Beitrag vom 3. Jun 2016
Antwort Antwort
EWeiss
(Gast)

n/a Beiträge
 
#1

AV bei umwandlung PAnsiChar nach C#

  Alt 2. Jun 2016, 10:14
Fehler!
Zitat:
System.AccessViolationException was unhandled
HResult=-2147467261
Message=Es wurde versucht, im geschützten Speicher zu lesen oder zu schreiben. Dies ist häufig ein Hinweis darauf, dass anderer Speicher beschädigt ist.
Der Fehler tritt nur in CSharp auf.
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:
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));
Liegt hier ein Konvertierungs Problem zwischen PAnsiChar und WideString vor?
Oder woher kommt der Fehler.

Es kracht hier..
Delphi-Quellcode:
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;
gruss

Geändert von EWeiss ( 2. Jun 2016 um 10:32 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#2

AW: AV bei umwandlung PAnsiChar nach C#

  Alt 2. Jun 2016, 11:12
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:
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;
Woher kommen eigentlich OldMedia und Title ??

Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Photoner

Registriert seit: 6. Dez 2012
Ort: Nürnberg
103 Beiträge
 
Delphi 10.1 Berlin Starter
 
#3

AW: AV bei umwandlung PAnsiChar nach C#

  Alt 2. Jun 2016, 11:18
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:
_IWmpEffects2
aus?

Schmeißt die Funktion in der DLL einen Fehler oder die C# Anwendung?

Grüße!
Chris
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.135 Beiträge
 
Delphi 12 Athens
 
#4

AW: AV bei umwandlung PAnsiChar nach C#

  Alt 2. Jun 2016, 11:18
Zitat:
WideString(EinPAnsiChar)
Bei derartigen Casts sollte man immer aufpassen.

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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu ( 2. Jun 2016 um 11:23 Uhr)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#5

AW: AV bei umwandlung PAnsiChar nach C#

  Alt 2. Jun 2016, 11:21
Zitat:
Woher kommen eigentlich OldMedia und Title ??
Aus der Funktion..
Delphi-Quellcode:
Title: PAnsiChar;
OldMedia: WideString; // global definiert
Zitat:
was für ein Delphi ??? 16/8Bit String/Char???
D2010.

Zitat:
aber ich würde mich nicht auf irgendwelche wilde typecasting Möglichkeiten verlassen sondern mit den richtigen Typen arbeiten also etwa so:
Wäre wohl sinnvoll werde das mal ändern.
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:
Versuchst du aus einer Anwendung, die mit C# geschrieben wurde auf die DLL, die mit Delphi geschrieben wurde zuzugreifen?
Ja..

Zitat:
_IWmpEffects2
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:
Bei derartigen Casts sollte man immer aufpassen.
Ok Danke.. Nur wie mache ich es richtig?

Seltsam jedoch wenn ich direkt nach Plugin Execute die Funktion aufrufe unabhängig von den Casts
BassVis.BASSVIS_SetInfo(_visParam, _mediaInfo); funktioniert es.
Aber nicht aus den Thread heraus, was aber wichtig ist um das Plugin zu informieren wenn ein neuer Titel abgespielt wird.

gruss

Geändert von EWeiss (11. Jul 2019 um 15:44 Uhr)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#6

AW: AV bei umwandlung PAnsiChar nach C#

  Alt 3. Jun 2016, 17:19
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:
        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);
        });
Hat also nichts mit meiner DLL zu tun ausschließlich mit C#

gruss

Geändert von EWeiss ( 3. Jun 2016 um 17:22 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:59 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz