Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Aufruf Delphi-Dll von DotNet, Probleme mit struct-Parameter (https://www.delphipraxis.net/197094-aufruf-delphi-dll-von-dotnet-probleme-mit-struct-parameter.html)

himitsu 18. Jul 2018 09:41

AW: Aufruf Delphi-Dll von DotNet, Probleme mit struct-Parameter
 
Statt AnsiString vielleicht WideString ... .NET sollte doch auch mit einem BSTR zurecht kommen?

Zumindestens ist es keine gute praktische Idee Delphi-Typen zu tauschen.
PAnsiChar, PWideChar oder eben BSTR, wobei Letzerer seine eigene Speicherverwaltung hat, welche von beiden Systemen angesprochen werden kann.

[edit]
Ups, TiGü übersehn. :oops:

TiGü 18. Jul 2018 09:47

AW: Aufruf Delphi-Dll von DotNet, Probleme mit struct-Parameter
 
Zitat:

Zitat von himitsu (Beitrag 1407638)

[edit]
Ups, TiGü übersehn. :oops:

Die nächsten Beiträge schreibe ich in animierter Flammenschrift (Größe 36)...

EWeiss 18. Jul 2018 09:50

AW: Aufruf Delphi-Dll von DotNet, Probleme mit struct-Parameter
 
bsp. von meiner LIB

*.dll

Delphi-Quellcode:
function BASSVIS_GetVersion: PAnsiChar; stdcall;

const
  cverfor = '%d.%d.%d.%d';

var
  ver : TBASSVIS_VERSION;
  str : string;
begin
  ver := GetVersionNumber;
  str := format(cverfor,[ver.Major,ver.Minor,ver.Special,ver.Build]);
  result := PAnsiChar(Ansistring(str));

end;
managed dll C#
Code:
    //BASSVIS_GetVersion
    public static string BASSVIS_GetVersion()
    {
      IntPtr ptr = BASSVIS_GetVersionPtr();
      if (ptr != IntPtr.Zero)
      {
        return Marshal.PtrToStringAnsi(ptr);
      }
      return null;
    }
    [DllImport("bass_vis.dll", EntryPoint = "BASSVIS_GetVersion", CharSet = CharSet.Auto)]
    private static extern IntPtr BASSVIS_GetVersionPtr();
Aber er scheint ja seine Lösung gefunden zu haben.

gruss

himitsu 18. Jul 2018 09:51

AW: Aufruf Delphi-Dll von DotNet, Probleme mit struct-Parameter
 
Statt Boolean könnte auch noch ByteBool, WordBool oder LongBool verwendet werden.
LongBool = BOOL (4 Bytes) im C++, was es irgendwie bestimmst auch im C# gibt.

EWeiss 18. Jul 2018 10:12

AW: Aufruf Delphi-Dll von DotNet, Probleme mit struct-Parameter
 
Zitat:

Zitat von himitsu (Beitrag 1407641)
Statt Boolean könnte auch noch ByteBool, WordBool oder LongBool verwendet werden.
LongBool = BOOL (4 Bytes) im C++, was es irgendwie bestimmst auch im C# gibt.

Richtig BOOL wäre bei Delphi <> Sharp die bessere Alternative.

gruss

KodeZwerg 18. Jul 2018 12:33

AW: Aufruf Delphi-Dll von DotNet, Probleme mit struct-Parameter
 
Zitat:

Zitat von JFB (Beitrag 1407634)
Vielen Dank! Du hast mich auf die richtige Spur gebracht.
---> Unmanaged.LPStr (statt wie bisher in UnmanagedType.ByValTStr) geändert.

Gern geschehen und von C# Seite her Klasse das Du es hinbekommen hast, wie dort definitionen lauten müssen habe ich keine Ahnung.

EWeiss 18. Jul 2018 12:40

AW: Aufruf Delphi-Dll von DotNet, Probleme mit struct-Parameter
 
Was mir noch auffällt du solltest den String initialisieren..

Code:
[MarshalAs(UnmanagedType.LPStr)]
public string Waehrung = string.Empty;

[MarshalAs(UnmanagedType.Bool)]
public bool P39A3;
Scheint irgendwie alles nur Halbfertig!

Zudem solltest du dir überlegen von der Struct abzuweichen und statt dessen eine Class verwenden.
https://docs.microsoft.com/de-de/dot...s-and-structs/
Code:
[Serializable, StructLayout(LayoutKind.Sequential)]
public sealed class TPara1Rec
https://docs.microsoft.com/de-de/dot...-class-members

gruss


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:14 Uhr.
Seite 2 von 2     12   

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