[C#] dll-Daten in IntPtr verarbeiten

kuhlmaehn

Erfahrenes Mitglied
Hi,
ich spiele gerade etwas mit dem CL NUI Treiber für Kinect rum und komme dort jetzt seit zwei Tagen nicht weiter.
Es geht mir speziell um einen dll-Aufruf, den ich nicht verarbeitet bekomme.
Der Import in C sieht wie folgt aus:
Code:
IMPORT(bool) GetNUICameraDepthFrameRAW(CLNUICamera cam, PUSHORT pData, int waitTimeout = 2000);
In C# dagegen so:
Code:
[DllImport("CLNUIDevice.dll", EntryPoint = "GetNUICameraDepthFrameRAW", CallingConvention = CallingConvention.Cdecl)]
public static extern bool GetCameraDepthFrameRAW(IntPtr camera, IntPtr data, int timeout);
Mit Angabe von camera und timeout werden die Daten dann also in den IntPtr data geladen.
Da die Auflösung 640x480 ist, habe ich mir nun zunächst einen IntPtr erzeugt und ihm Speicherplatz zugewiesen:
Code:
IntPtr pout = Marshal.AllocHGlobal(640 * 480 * sizeof(uint));
Ohne das allozieren habe ich zwar keinen Fehler bekommen, allerdings enthielt pout dann auch keinen Pointer. Jetzt müsste ich doch, angefangen bei der Adresse von pout, 640 * 480 * sizeof(uint) viele Pointer haben, die ich nun alle dereferenzieren könnte, um an die Daten zu kommen. Hier bin ich allerdings nicht weitergekommen :(
Gibt es denn vielleicht in C# einen besseren Weg um an die Ausgabe einer dll zu gelangen?
 
Hi.
In C# dagegen so:
Code:
[DllImport("CLNUIDevice.dll", EntryPoint = "GetNUICameraDepthFrameRAW", CallingConvention = CallingConvention.Cdecl)]
public static extern bool GetCameraDepthFrameRAW(IntPtr camera, IntPtr data, int timeout);
Mit Angabe von camera und timeout werden die Daten dann also in den IntPtr data geladen.
Da die Auflösung 640x480 ist, habe ich mir nun zunächst einen IntPtr erzeugt und ihm Speicherplatz zugewiesen:
Code:
IntPtr pout = Marshal.AllocHGlobal(640 * 480 * sizeof(uint));
Ohne das allozieren habe ich zwar keinen Fehler bekommen, allerdings enthielt pout dann auch keinen Pointer. Jetzt müsste ich doch, angefangen bei der Adresse von pout, 640 * 480 * sizeof(uint) viele Pointer haben, die ich nun alle dereferenzieren könnte
Warum sollten da Zeiger drin sein? Soweit ich verstehe sind da Pixel drin die du untersuchen kannst. Warum verwendest du denn uint statt ushort?
Gibt es denn vielleicht in C# einen besseren Weg um an die Ausgabe einer dll zu gelangen?
Wenn die Größe des Arrays immer gleich ist, kannst du auch direkt ein Array übergeben:
C#:
[DllImport("CLNUIDevice.dll", EntryPoint = "GetNUICameraDepthFrameRAW", CallingConvention = CallingConvention.Cdecl)]
public static extern bool GetCameraDepthFrameRAW(IntPtr camera, 
 [MarshalAs(UnmanagedType.LPArray, SizeConst=640*480)] ushort[] data, int timeout);
Gruß
 
Hey super, dank dir. Das ist natürlich sehr elegant :)
Das uint hatte ich fälschlicher Weise von DepthFrameRGB32 genommen, weil dort PDWORD steht. Außerdem hatte ich das "StartCamera()" zu dicht vor dem Aufruf, sodass dann mit einem timeout von 0 offenbar zu wenig Zeit für eine Ausgabe vergangen war.
Ich hab jetzt versucht, dass ColorFrameRGB32 analog umzusetzten, allerdings bekomme ich hier nur wieder nullen als Ausgabe.
Hier sind mal die weiteren imports:
Code:
// Camera video frame image data retrieval
IMPORT(bool) GetNUICameraColorFrameRAW(CLNUICamera cam, PBYTE pData, int waitTimeout = 2000);
IMPORT(bool) GetNUICameraColorFrameRGB24(CLNUICamera cam, PBYTE pData, int waitTimeout = 2000);
IMPORT(bool) GetNUICameraColorFrameRGB32(CLNUICamera cam, PDWORD pData, int waitTimeout = 2000);

// Camera depth frame image data retrieval
IMPORT(bool) GetNUICameraDepthFrameRAW(CLNUICamera cam, PUSHORT pData, int waitTimeout = 2000);
IMPORT(bool) GetNUICameraDepthFrameCorrected12(CLNUICamera cam, PUSHORT pData, int waitTimeout = 2000);
IMPORT(bool) GetNUICameraDepthFrameCorrected8(CLNUICamera cam, PBYTE pData, int waitTimeout = 2000);
IMPORT(bool) GetNUICameraDepthFrameRGB32(CLNUICamera cam, PDWORD pData, int waitTimeout = 2000);
Lieg ich denn bei GetCameraColorFrameRGB32 mit einem uint[] bzw. UInt32[] richtig? Das hat beides nicht funktioniert.
Irgendwo hatte ich allerdings gelesen, dass UInt32 dem DWORD entspricht.
Danke!
 

Neue Beiträge

Zurück