mikrocontroller.net

Forum: PC-Programmierung Wrapper Marshalling-Problem


Autor: Mario G. (suicided)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Forum,

ich schreibe momentan einen .NET-Wrapper für die Winsock2-Funktionen mit 
C++. Dort muss ich eine Struktur in eine Klasse umwandeln, was ansich 
auch funktioniert. Problematisch ist es aber bei folgender Variable:
char FAR  FAR **h_aliases;
Das habe ich in eine String-Liste 
(System::Collections::Generic::List<String>) umgewandelt, was im C++ 
Wrapper auch tadellos geschluckt wird. Verarbeite ich die Klasse jedoch 
in C#, meckert der Compiler "'...h_aliases' is not supportet by the 
language". ...was mir ziemlich unlogisch erscheint - wozu nimmt man denn 
.NET-Datentypen?
Hat vielleicht jemand hier eine Idee, wie man das in anderer Art und 
Weise wrappen könnte? Das ist halt alles ziemlich dynamisch - weder die 
Länge noch die Anzahl der Strings ist vorher bekannt.

Viele Grüße
mario

Die ursprüngliche Struktur:
typedef struct hostent {
  char FAR      *h_name;
  char FAR  FAR **h_aliases;
  short         h_addrtype;
  short         h_length;
  char FAR  FAR **h_addr_list;
} HOSTENT, *PHOSTENT, FAR *LPHOSTENT;
Meine dafür angelegte Klasse:
public ref class WS2_hostent {
public:
  String^ h_name;
  List<String^> h_aliases;
  Int16 h_addrtype;
  Int16 h_length;
  List<String^> h_addr_list;

  WS2_hostent();
  !WS2_hostent();
  ~WS2_hostent();
};
Die verarbeitende Funktion, welche aus C# aufgerufen wird:
Int32 WS2_Functions::gethostbyname(String^ name, WS2_hostent^ WS2_HostEnt) {
  hostent* hostEnt = ::gethostbyname((char*)(void*)Marshal::StringToHGlobalAnsi(name));
  WS2_HostEnt->h_name = String(hostEnt->h_name).ToString();
  while (*(hostEnt->h_aliases)) {
    WS2_HostEnt->h_aliases.Add(String(*hostEnt->h_aliases).ToString());
    hostEnt->h_aliases++;
  }
  WS2_HostEnt->h_addrtype = hostEnt->h_addrtype;
  WS2_HostEnt->h_length = hostEnt->h_length;
  while (*(hostEnt->h_addr_list)) {
    WS2_HostEnt->h_addr_list.Add(String(*hostEnt->h_addr_list).ToString());
    hostEnt->h_addr_list++;
  }
  return (hostEnt != NULL) ? WS2_Definitions::WS2_WSAOK : (Int32)WSAGetLastError();
}
Die Verwendung in C#, die fehlschlägt:
private void button3_Click(object sender, EventArgs e) {
  WS2_hostent hostEnt = new WS2_hostent();
  SocketFunctions.gethostbyname("www.google.de", hostEnt);
  foreach (String s in hostEnt.h_aliases) { // !!!
    textBox1.AppendText("\th_alias: " + s + "\r\n");
  }
}

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.