Wenn dein Problem oder deine Frage geklärt worden ist, markiere den Beitrag als "Lösung",
indem du auf den "Lösung" Button rechts unter dem entsprechenden Beitrag klickst. Vielen Dank!
' schrieb:Nochmal zum bessern Verständnis:
Ich befasse mich mit einer Datenaufnahme, welche über eine Bibliothek in C++ abläuft. Hier gibt es die Möglichkeit eine Funktion zu verwenden, die mir in einen von mir allocierten Speicherbereich Daten hineinschreibt. Diese Funktion erwartet von mir einen Daten-Pointer (siehe oben).
Ich bin nun folgendermaßen vorgegangen:
Ich reserviere mir Speicher mittels der Funktion DSNewHandle.
<div class='codetop'>CODE</div><div class='codemain' style='height:200px;white-space:pre;overflow:auto'>struct {
int32 dimSize[2];
uInt16 elmements;
} **UInt16Handle;
UInt16Handle MemoryHdl;
MemoryHdl = (UInt16Handle)DSNewHClr(sizeof(uInt16)*SizeX*SizeY);
</div>
Habs alternativ auch so versucht:
<div class='codetop'>CODE</div><div class='codemain' style='height:200px;white-space:pre;overflow:auto'>struct {
int32 dimSize[2];
uInt16 elmements;
} **UInt16Handle;
UInt16Handle MemoryHdl = NULL;
NumericArrayResize(uW, 2, (UHandle*)&MemoryHdl, SizeX*SizeY);
(*MemoryHdl)->dimSize[1] = SizeX;
(*MemoryHdl)->dimSize[2] = SizeY;
</div>
Die Funktion aus der Bibliothek sieht in etwa so aus:
<div class='codetop'>CODE</div><div class='codemain' style='height:200px;white-space:pre;overflow:auto'>CreateBuffer(SystemID, long SizeX, long SizeY, long Type, Attribute, long ControlFlag, long Pitch, void *DataPtr, BufferID);</div>
System ID: ergibt sich aus nach dem Verbindungsaufbau mit der Karte (OK)
SizeX: Ist ebenso kein Problem und wird aus einer Datei ausgelesen (OK)
SizeY: siehe SizeX
Type: UInt16 (OK)
Attribute: Können aus einer Liste gewählt werden (OK)
ControlFlag: PHYSICAL_ADDRESS (Specifies that DataPtr is a physical address that points to the data) (OK)
Pitch: Abstand zwischen zwei Zeilen des Arrays (Kann in Bildpunkten und Bytes angegeben werden). Entspricht quasi meinem SizeX (OK?)
DataPtr: Hier muss nun aus dem Handle der Datenpointer extrahiert werden. (NICHT OK)
BufferID: Ergibt sich wieder aus dem vorherigen Programmablauf (OK)
Diese Funktion sollte nun laut Beschreibung die Daten direkt in den von mir reservierten Speicher schreiben. Leider funktioniert es bis jetzt nicht.
Danke, eure abrissbirne
Also die Funktion sollte eigentlich sogar mit der Call Library Node direkt aufrufbar sein. Allerdings macht mir das ControlFlag = PHYSICAL_ADDRESS einige Sorgen. In Windows 32Bit gibt es auf Ring3 Ebene (dem User Space) keine physikalischen Adressen sondern nur lineare Addressen. Zugriff auf physikalische Addressen sind dem Kernel und Treibern die darin laufen vorenthalten.