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
Seit der Erkenntnis, dass der Mensch eine Nachricht ist, erweist sich seine körperliche Existenzform als überflüssig.
- 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
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.
Hab ich auch schon probiert.
Der sagt immer attempted to read or write protected memory.
mft Tom
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.
ref und out darf nicht in Verbindung mit ref oder out verwendet werden
mfg Tom
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.
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.
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