Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   C# is a 'field' but is used like a 'type' (https://www.delphipraxis.net/184628-field-but-used-like-type.html)

EWeiss 10. Apr 2015 17:22

is a 'field' but is used like a 'type'
 
Ich erstelle eine Class

Code:
  [SuppressUnmanagedCodeSecurity]
  public sealed class TagsLibraryDefs
  {
    IntPtr HTags = IntPtr.Zero;

    //TagsLibrary_Create
    [DllImport("TagsLib.dll", EntryPoint = "TagsLibrary_Create", CharSet = CharSet.Auto)]
    public static extern HTags TagsLibrary_Create();

  }
Und bekomme einen Fehler wie im Thread Titel beschrieben.

In C++ ist HTAGS als Public definiert da HTAGS von verschiedenen Externals verwendet werden.

Code:
typedef void* HTAGS;
Also wenn HTAGS ermittelt wurde mit TagsLibrary_Create werden in folgenden API's dieses Handle übergeben.

Beispiel:
Code:
typedef BOOL(TAGSLIBCALL *t_TagsLibrary_Free)(HTAGS Tags);
Jemand eine Idee? was schief läuft.

EDIT:
Ich könnte mir das HTAGS vielleicht sparen wenn ich direkt IntPtr zurückgebe.
Hmm....

gruss

Union 10. Apr 2015 17:30

AW: is a 'field' but is used like a 'type'
 
Wie wär's wenn Du das in eine Methode packst?

EWeiss 10. Apr 2015 17:46

AW: is a 'field' but is used like a 'type'
 
Zitat:

Zitat von Union (Beitrag 1297113)
Wie wär's wenn Du das in eine Methode packst?

Wenn ich wüsste wie das geht gerne..
Bin noch am Lernen :)

Wie sieht die aus?

Edit
OK.. Methode meinst du

Public IntPtr Test(..) Function
Public void Test(..) Procedure

Nur wo einsetzen
Ich schreibe ne DLL

gruss

Dejan Vu 10. Apr 2015 18:59

AW: is a 'field' but is used like a 'type'
 
Code:
    IntPtr HTags = IntPtr.Zero; // *1

    public static extern HTags TagsLibrary_Create(); // *2
*1 deklariert eine private Variable 'HTags' vom Typ 'Integer' und weißt ihr einen Wert zu.
*2 deklariert eine statische Methode 'TagsLibrary_Create()' mit dem Rückgabetype... 'HTags'.

Nun ist 'HTags' eine private Variable, wird aber dort verwendet, wo eigentlich ein Typ stehen soll.

In Delphi wäre das z.B.

Delphi-Quellcode:
Var
  HTags : PInteger = Nil;

Function TagsLibrary_Create() : HTags;
Das ergibt doch keinen Sinn.

Was Du willst (TypeDef) lässt sich in C# nicht machen. Du kannst am Anfang der Datei zwar 'using HTags = IntPtr;' schreiben, aber das gilt nur für die Datei. Wäre 'IntPtr' eine Klasse, könntest Du 'class HTags : IntPtr{}' verwenden, aber 'IntPtr' ist ein struct (Record) und damit geht inheritance nicht.

Verwende einfach IntPtr statt HTags.

EWeiss 10. Apr 2015 19:20

AW: is a 'field' but is used like a 'type'
 
Zitat:

*1 deklariert eine private Variable 'HTags' vom Typ 'Integer' und weißt ihr einen Wert zu.
*2 deklariert eine statische Methode 'TagsLibrary_Create()' mit dem Rückgabetype... 'HTags'
Und genau das habe ich gemacht mit der Rückgabe siehe Thread Titel. ;)

Zitat:

Verwende einfach IntPtr statt HTags.
Denke auch da wird mir wohl nichts anderes übrigbleiben.
Methoden sind da auch überflüssig hab's getestet.
Da kann ich mir auch einfach in der Anwendung
Code:
Dim Tag as IntPtr
verwenden und gut ist.


gruss

Dejan Vu 10. Apr 2015 19:23

AW: is a 'field' but is used like a 'type'
 
Eben. Genau das hast Du gemacht. Und deshalb kommt der Fehler. Und da Du fragst 'Jemand eine Idee? was schief läuft.' ist diese Frage zumindest beantwortet, ne war.

EWeiss 10. Apr 2015 19:27

AW: is a 'field' but is used like a 'type'
 
Zitat:

Zitat von Dejan Vu (Beitrag 1297121)
Eben. Genau das hast Du gemacht. Und deshalb kommt der Fehler. Und da Du fragst 'Jemand eine Idee? was schief läuft.' ist diese Frage zumindest beantwortet, ne war.

Sieht nicht danach aus das sie beantwortet ist.
Dein Vorschlag ist doch genau das was ich auch gemacht habe.

Und du schreibst ja selbst
Zitat:

Das ergibt doch keinen Sinn.
Muss dann halt alle Funktionen wie hier

Code:
typedef int(TAGSLIBCALL *t_TagsLibrary_TagCount)(HTAGS Tags, TTagType TagType);

Die (HTAGS Tags) verwenden HTAGS mit IntPtr ersetzen.
Ist letztendlich nur eine Schreibweise ob da jetzt HTAGS gecastet wird oder nicht letztendlich ist es ein IntPtr.
Na ja hab die Lib nicht geschrieben für die ich den Wrapper erstelle.

Wie das in Delphi aussieht ist klar nur es lässt sich in C# anscheinend nicht verwenden.

gruss

Sir Rufo 10. Apr 2015 19:45

AW: is a 'field' but is used like a 'type'
 
Weil du ein Feld genauso benannt hast wie einen Typ kommt dieser Fehler.

Mach das nicht und der Fehler geht weg.

Die einfachste Lösung ist ja wohl dem Feld einen anderen Namen zu geben

EWeiss 10. Apr 2015 19:48

AW: is a 'field' but is used like a 'type'
 
Zitat:

Zitat von Sir Rufo (Beitrag 1297125)
Weil du ein Feld genauso benannt hast wie einen Typ kommt dieser Fehler.

Mach das nicht und der Fehler geht weg.

Die einfachste Lösung ist ja wohl dem Feld einen anderen Namen zu geben

Welchen Feld ?

@Dejan Vu
Ach das sollte ein Zitat(Quote) sein mit dem du mir mitgeteilt hast was ich falsch gemacht habe?
Habe das wohl falsch verstanden.
Im Rahmen als Quote wäre es verständlicher gewesen hab jetzt angenommen das wäre ein Vorschlag von dir gewesen.
Na gut ..



gruss

Sir Rufo 10. Apr 2015 21:25

AW: is a 'field' but is used like a 'type'
 
Variablen in einer Klasse nennt man Feld (engl. Field)
Code:
  [SuppressUnmanagedCodeSecurity]
  // Ich bin eine Klasse
  public sealed class TagsLibraryDefs
  {
    // Ich bin ein Feld, heiße HTags und bin vom Typ IntPtr
    IntPtr HTags = IntPtr.Zero;

    //TagsLibrary_Create
    [DllImport("TagsLib.dll", EntryPoint = "TagsLibrary_Create", CharSet = CharSet.Auto)]
    // Ich bin eine Methode und liefere einen Wert vom Typ HTags zurück
    public static extern HTags TagsLibrary_Create();

  }

EWeiss 10. Apr 2015 21:56

AW: is a 'field' but is used like a 'type'
 
Sorry aber was soll das jetzt. ?

Ich weiß was eine Klasse ein Feld und eine Methode ist.
Meinen Fehler immer wieder zu posten bringt einfach nichts.

Es ist mir bekannt das es falsch ist.
Und wie schon gesagt höchstwahrscheinlich so wie in Delphi/C++ nicht umsetzbar.
Wenn doch wie ist die Lösung. ?

gruss

Sir Rufo 10. Apr 2015 22:05

AW: is a 'field' but is used like a 'type'
 
Zitat:

Zitat von EWeiss (Beitrag 1297177)
Sorry aber was soll das jetzt. ?

Ich weiß was eine Klasse ein Feld und eine Methode ist.
Meinen Fehler immer wieder zu posten bringt einfach nichts.

Es ist mir bekannt das es falsch ist.
Und wie schon gesagt höchstwahrscheinlich so wie in Delphi/C++ nicht umsetzbar.
Wenn doch wie ist die Lösung. ?

gruss

Entschuldigung für die Störung, aber wenn du keine Antwort von mir möchtest, dann richte keine Frage an mich.

Zur Erinnerung (ist wohl schon zu lange her)
Zitat:

Zitat von EWeiss (Beitrag 1297127)
Zitat:

Zitat von Sir Rufo (Beitrag 1297125)
Weil du ein Feld genauso benannt hast wie einen Typ kommt dieser Fehler.

Mach das nicht und der Fehler geht weg.

Die einfachste Lösung ist ja wohl dem Feld einen anderen Namen zu geben

Welchen Feld ?

PS: Keine weitere Störungen meinerseits auf diesem Kanal ... over and out :roll:

jfheins 10. Apr 2015 22:09

AW: is a 'field' but is used like a 'type'
 
Die beste Lösung wäre wohl:

Zitat:

Zitat von Dejan Vu (Beitrag 1297118)
Du kannst am Anfang der Datei zwar 'using HTags = IntPtr;' schreiben, aber das gilt nur für die Datei.

Das musst du dann eben in jeder Datei schreiben. Alternativ geht ja immer noch:

Zitat:

Zitat von Dejan Vu (Beitrag 1297118)
Verwende einfach IntPtr statt HTags.

Das sind jetzt zwei Wege, die relativ gut sind, und funktionieren sollten. Dass man einen Pointer noch typedef'd, damit man das richtige übergibt, ist eben typisch C++ und weniger C#. (Ein typedef Pointer ist eben immer noch ein Pointer und da könnte immer noch quasi alles dahinter stecken.)

Dejan Vu 10. Apr 2015 22:12

AW: is a 'field' but is used like a 'type'
 
Die beste Lösung wäre einfach, keine Synonyme für Typen zu verwenden. Das verwirrt doch nur.

EWeiss 10. Apr 2015 22:26

AW: is a 'field' but is used like a 'type'
 
Zitat:

Zitat von Dejan Vu (Beitrag 1297180)
Die beste Lösung wäre einfach, keine Synonyme für Typen zu verwenden. Das verwirrt doch nur.

Die Fremd DLL ist in Delphi geschrieben und da machen die meisten Leute das so zumindest wie ich das so sehe.

Ich wollte halt die API so auslegen wie es in C++/Delphi ist, geht aber wohl nicht.
Ist halt nicht überall Konform abhängig von der Developer Sprache halt.

Ich habe es nun mit IntPtr gemacht.


Zitat:

PS: Keine weitere Störungen meinerseits auf diesem Kanal ... over and out
Na da kann man nichts machen.. Ist halt so wie es ist.

gruss

Sailor 11. Apr 2015 01:15

AW: is a 'field' but is used like a 'type'
 
C-Sprachen sind case-sensitive, d.h. HTAGS != HTags

EWeiss 11. Apr 2015 01:42

AW: is a 'field' but is used like a 'type'
 
Zitat:

Zitat von Sailor (Beitrag 1297188)
C-Sprachen sind case-sensitive, d.h. HTAGS != HTags

Ist mir klar ;)
Hat aber nichts mit meinem Problem zu tun.

gruss

Aviator 11. Apr 2015 12:22

AW: is a 'field' but is used like a 'type'
 
Was Sir Rufo meinte ist, dass du eine Variable (bzw. ein Feld) in der Klasse vom Typ IntPtr mit dem Namen HTags erstellt.
Die Funktion sollte aber den Typ HTAGS zurückgeben. Deshalb wohl auch die Anmerkung von Sailor.
Zitat:

Zitat von Sailor (Beitrag 1297188)
C-Sprachen sind case-sensitive, d.h. HTAGS != HTags

Wenn du deine Funktion so deklarieren würdest, wäre es was anderes und würde vielleicht auch funktionieren.

Code:
public static extern HTAGS TagsLibrary_Create();
Man beachte das groß geschriebene HTAGS. Aber schlag mich bitte nicht, wenn das nicht so funktioniert wie gewünscht. Bin auch kein C#/C++ Profi. Habs mir nur mal für ein kleineres Projekt angesehen.

Dein HTAGS Typ solltest du dir dann so einbauen können.

Code:
typedef IntPtr HTAGS


Stimmt, in C# gibt es ja gar kein Typdef :shock:

Vielleicht hilft es ja trotzdem weiter. :roll:

EWeiss 11. Apr 2015 20:49

AW: is a 'field' but is used like a 'type'
 
Zitat:

Die Funktion sollte aber den Typ HTAGS zurückgeben. Deshalb wohl auch die Anmerkung von Sailor.
NÖ.
Sie muss identisch mit dem Definierten Name sein. (Groß und Kleinschreibung beachtend)
Wenn als
Code:
IntPtr HtAgS = IntPtr.Zero;
definiert muss sie auch in folge so benannt werden.
Aber das merkt der Compiler da muss man sich selbst nicht drum kümmern.

Zitat:

Aber schlag mich bitte nicht, wenn das nicht so funktioniert wie gewünscht.
Warum sollte ich :)

Code:
public static extern HTAGS TagsLibrary_Create();
Genau so hab ich es gemacht.
Code:
IntPtr HTags = IntPtr.Zero;
public static extern HTags TagsLibrary_Create();
HTags = HTags
HTAGS = HTAGS

HTAGS = HTags geht nicht.. Was ich aber schon sagte (Ist mir bekannt)


gruss

EWeiss 11. Apr 2015 22:00

AW: is a 'field' but is used like a 'type'
 
Letztendlich habe ich die Lösung dann doch selbst noch erarbeitet (nicht aus dem Internet)

Code:
  [Serializable, StructLayout(LayoutKind.Sequential)]
  public struct HTAGS
  {
    private IntPtr _htags;

    public IntPtr HTags
    {

      get { return _htags; }

      set { _htags = value; }

    }

  }
Jetzt geht das!
Code:
    //TagsLibrary_Create
    [DllImport("TagsLib.dll", EntryPoint = "TagsLibrary_Create", CharSet = CharSet.Auto)]
    public static extern HTAGS TagsLibrary_Create();
und das! (Darum ging es mir.. Die API gleich zu halten mit den Aufruf Konventionen.
Code:
    //TagsLibrary_Free
    [return: MarshalAs(UnmanagedType.Bool)]
    [DllImport("TagsLib.dll", EntryPoint = "TagsLibrary_Free", CharSet = CharSet.Auto)]
    public static extern bool TagsLibrary_Free(HTAGS Tags);
in der Anwendung wird dann einmalig HTAGS definiert.
Code:
Dim hTags As HTAGS
Code:
hTags = TagsLib.TagsLibrary_Create()

If TagsLib.TagsLibrary_Free(hTags) Then
    MessageBox.Show("Is Free")
End If
In Delphi ist der Aufruf wie folgt!
Delphi-Quellcode:
t_TagsLibrary_Free = function (Tags: HTags): LongBool; {$IFDEF MSWINDOWS}stdcall{$ELSE}cdecl{$ENDIF};


Und genau diese Art des Aufrufs wollte ich beibehalten Tags: HTags
Deshalb schreibe ich die Lib (Wrapper in C#) damit Developer mit VB_NET sich mit der API nicht rumquälen müssen.


gruss


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:39 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