Laden...

marshal va_list

Erstellt von TomTom85 vor 16 Jahren Letzter Beitrag vor 16 Jahren 2.945 Views
T
TomTom85 Themenstarter:in
23 Beiträge seit 2007
vor 16 Jahren
marshal va_list

Hallo zusammen!

Ich hab mal wieder ein Problemchen beim Marshaln.
Ich hab eine Funktion, die ein va_list erwartet.
Das ganze sieht so aus:


int __stdcall DDC_CreateFilePropertyV (DDCFileHandle file,
                                       const char *property,
		       DDCDataType dataType,
                                       va_list args);

Mein bisheriger Ansatz war, hier ein "Object" zu übergeben und als
als UnmanagedType.Any zu marsheln, aber das scheint wohl nicht zu funktionieren.
Hab dazu nicht wirklich etwas bei gogle gefunden.

Vielleicht kann mir ja von euch jemand helfen.

Vielen dank schonmal im voraus

mfg Tom

2.921 Beiträge seit 2005
vor 16 Jahren
  1. guck mal bei PInvoke.net
  2. falls dort nix gefunden, guck mal nach DDCFileHandle ob du das in einem Include-File (C++-Header Datei) findest, und versuch die Klasse oder die Struct nach C# umzusetzen. Das sollte funktionieren.
  3. Gibt's in anderen Foren schon was dazu vielleicht mit VB?

Seit der Erkenntnis, dass der Mensch eine Nachricht ist, erweist sich seine körperliche Existenzform als überflüssig.

T
TomTom85 Themenstarter:in
23 Beiträge seit 2007
vor 16 Jahren
  1. falls dort nix gefunden, guck mal nach DDCFileHandle ob du das in einem Include-File (C++-Header Datei) findest, und versuch die Klasse oder die Struct nach C# umzusetzen. Das sollte funktionieren.

Wie der Rest der Funktion gemarshalt wird ist mir klar. Es geht nur um das blöde va_list.
Wie ich ein vararg marshaln kann habe ich beim msdn schon gefunden, aber zum Thema va_list find ich einfach nix. Das ist ja auch schon ein sehr sehr altest Konstrukt.

mfg Tom

2.921 Beiträge seit 2005
vor 16 Jahren

ok sorry. Dann Probier mal ob


params object [] aListElements

funktioniert.

Seit der Erkenntnis, dass der Mensch eine Nachricht ist, erweist sich seine körperliche Existenzform als überflüssig.

T
TomTom85 Themenstarter:in
23 Beiträge seit 2007
vor 16 Jahren

Hab ich auch schon probiert.

Der sagt immer attempted to read or write protected memory.

mft Tom

2.921 Beiträge seit 2005
vor 16 Jahren

und dasselbe mit ref oder out schlüsselwort vorangestellt?

Seit der Erkenntnis, dass der Mensch eine Nachricht ist, erweist sich seine körperliche Existenzform als überflüssig.

T
TomTom85 Themenstarter:in
23 Beiträge seit 2007
vor 16 Jahren

ref und out darf nicht in Verbindung mit ref oder out verwendet werden

mfg Tom

2.921 Beiträge seit 2005
vor 16 Jahren

ref und out darf nicht in Verbindung mit ref oder out verwendet werden

das schliesst sich aus?!

meintest du vielleicht params?

Seit der Erkenntnis, dass der Mensch eine Nachricht ist, erweist sich seine körperliche Existenzform als überflüssig.

T
TomTom85 Themenstarter:in
23 Beiträge seit 2007
vor 16 Jahren

äh ja natürlich 🙂

S
8.746 Beiträge seit 2005
vor 16 Jahren

Dieser va_List-Müll ist compiler-spezifisch. Man müßte erstmal rausfinden, was der aus dem Makro macht. Im besten Fall ist das ein Zeiger auf ein Array. Musst du dann per IntPtr übergeben.

Ich würde aber eher davon ausgehen, dass sowas gar nicht geht. va_list ist halt grundsätzlich inkompatibel mit dem Rest der Welt.

T
TomTom85 Themenstarter:in
23 Beiträge seit 2007
vor 16 Jahren

Vielen Dank für den Tip.
Es funktioniert wenn ich es als array aus IntPtr übergebe.


IntPtr[] ptr = new IntPtr[1];
                    byte[] arr = new byte[] { (byte)'H', (byte)'a', (byte)'l', (byte)'l',   (byte)'o', (byte)'\0' };
                    ptr[0] = Marshal.AllocHGlobal(sizeof(byte) * arr.Length);
                    Marshal.Copy(arr, 0, ptr[0], arr.Length);
Result = VSDDCTDM.DDC_SetFilePropertyV(file, Prop.Name, ptr);

Das DllImport sieht so aus:


[DllImport("nilibddc.dll", CharSet = CharSet.Ansi)]
        public static extern int DDC_SetFilePropertyV(
            IntPtr file,
            string property,
            IntPtr[] value
            );

Wie sich das ganze verhält, wenn man mehrere Argumente übergibt weiß ich nicht, weil meine Funktion hier immer nur ein Argument erwartet.
Aber für ein Argument funtkioniert das zumindest.

mfg Tom