Hm… das mit diesen „Opaquen Pointern“ läuft normalerweise (d.h. immer: soweit ich das weiß) etwas anders (alles mir vieeelen Vorbehalten: )
Man weiß erstmal NUR, dass diese struct existiert. Es ist also (sinngemäß, nicht notwendigerweise technisch genau so) so dass man einen Header hat, wo nur eine Typdeklaration drinsteht
typedef struct tag_BarCode t_BarCode;
Man weiß nicht, was in dieser Struct enthalten ist. In irgendeiner (als „Implementierungsdetail“ versteckten) C-Datei steht dann die tatsächliche Defintion.
Als Client kann man mit dieser Struct direkt nichts machen. Man kann nur einen „Pointer auf diese Struct“ definieren. Aber insbesondere wird sowas wie sizeof(thisStruct)
nicht funktionieren, weil man schlicht nicht weiß, wie groß diese Struct ist. Man kann also auch NICHT den Speicher für diese struct selbst malloc’en.
Genau dafür ist ja BCAlloc da:
Man definiert einen Pointer auf so eine struct. Dessen Adresse (also einen Pointer auf einen Pointer) übergibt man an die BCAlloc-Funktion. Die schreibt in den ersten Pointer dann den Pointer auf die struct, die sie intern allokiert hat:
t_BarCode *clientPointer;
// Übergib die Adresse des Pointers (also einen Pointer auf den Pointer) :
BCAlloc(&clientPointer);
// Verwende den nun gefüllten Pointer
BCSetTextA(clientPointer, "foo", 3)
Ausführlicher könnte man auch schreiben:
t_BarCode *clientPointer;
t_BarCode **pointerToClientPointer = &clientPointer;
BCAlloc(pointerToClientPointer);
// Verwende den nun gefüllten Pointer
BCSetTextA(clientPointer, "foo", 3)
Die „BCAlloc“-Funktion würde dann sowas machen wie
void BCAlloc(t_BarCode **pp)
{
// Die Implementierung KENNT die struct, und
// kann deswegen malloc und sizeof machen:
t_BarCode *p = malloc(sizeof(t_BarCode));
// Schreibe den allokierten Pointer da hin, wo der
// übergebene Pointer hin zeigt. (Das landet dann
// im oben angedeuteten "clientPointer")
*pp = p;
}
Als Benutzer hantiert man NUR mit dem Pointer, und weiß nie, worauf der eigentlich zeigt. Das ist die Objektorientierung der 80er Jahre
Und, wie gesagt, das ist vom Muster her nicht unüblich, deswegen sollte JNA das eigentlich auf die Reihe kriegen. Die oben erwähnte Suchanfrage „jna opaque pointer struct“ liefert z.B. java - JNA: how to deal with unkown structs? - Stack Overflow oder java - How do i deal with opaque pointers in JNA? - Stack Overflow , aber … ich habe mich mit JNA noch nicht so weit beschäftigt, dass ich direkt den Code für diesen Fall hier herschreiben könnte.