Autor Beitrag
D.Follmann
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 31



BeitragVerfasst: Do 30.08.07 09:24 
Hallo,

ich habe ein Problem mit einer DLL.
Ich kann eine Methode in der dll aufrufen. diese methode verlangt einen Zeiger auf eine Datenstruktur bestimmter anordnung.
Leider habe ich die Interface-Beschreibung der dll nur für VB6 vorliegen:
ausblenden Quelltext
1:
2:
'ctrl is a pointer to a structure of type property
Declare Funktion setproperties Lib "dllName.dll" (ctrl as Any)

mit andern Worten: die dll will eine Referenz auf eine Struktur vom typ property.
in VB sieht diese Struktur so aus:
ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
Public Type property
  a as long
  b as long
  c as long
  d as long
  e as long
  f as long
  txtLen as Byte
  txt as String*100
End Type


in C# habe ich die struktur dann so angelegt:

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
public struct property
    {
        public int a;      
        public int b;       
        public int c;      
        public int d;       
        public int e;          
        public int f;         
        public byte txtLen;       
        public string txt;        
    }


Die longs sind nun ja ints wegen der 16-Bit-Größe.

Der Aufruf geht so:

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
//Methode wird vorher per DLLLImport eingebunden und erhält den Namen
// setProperty(ref property prop)
//Property xxx wird vorher initialisiert und werte werden eingetragen...

setProperty(ref xxx);


Der Methodenaufruf funktioniert auch einwandfrei. mit einer weiteren Methode kann ich nachsehen, ob es geklappt hat. die int/long/byte-Werte passen alle. Aber der String stimmt niht.
Ich nehme an, dass das am Aufbau der Strings in VB liegt.
Ich habe einfach angenommen ein c#-string und ein vb-String seien gleich.
Aber wie genau ist ein vb-string aufgebaut?wenn ich das wüsste, könnte ich das ja als byte-array anlegen statt string.
Wäre nett wenn mir da jmnd weiterhelfen könnte.
Danke!

Moderiert von user profile iconChristian S.: Code- durch C#-Tags ersetzt


Zuletzt bearbeitet von D.Follmann am Fr 07.09.07 10:22, insgesamt 2-mal bearbeitet
D.Follmann Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 31



BeitragVerfasst: Fr 31.08.07 13:45 
UND DIE LÖSUNG IST SO SIMPEL!!!

:) ich habs gerade rausgefunden:

[MarshalAs(UnmanagedType.BStr)] public String txt;

das ist die Zeile die den String in der structur anlegt. alles was fehlte war das "MarshalAs"-Attribut.

Trotzdem Danke für die Hilfe!