D Bindings for C Opaque Pointers

Kyle Ingraham kyle at kyleingraham.com
Thu Dec 3 00:30:06 UTC 2020


Hello all. I am new to D and loving the experience so far.

I am trying to make use of a C library from Canon that provides a 
header and a pre-compiled binary containing implementations of 
declarations found in the header. I used the excellent guide at 
https://www.gamedev.net/articles/programming/general-and-gameplay-programming/binding-d-to-c-r3122/ to get started and so far I can initialize the library and embed it within my D application. So far so great!

Where I am running into problems is creating D bindings for this 
function declaration:

// EDSDK.h
EdsError EDSAPI EdsGetCameraList(EdsCameraListRef* 
outCameraListRef);
//

If accepts a pointer to EdsCameraListRef that is declared as:

// EDSDKTypes.h
typedef struct __EdsObject* EdsBaseRef;
typedef EdsBaseRef EdsCameraListRef;
//

 From my reading I learned that EdsCameraListRef is an alias of an 
alias for an opaque pointer. It allowed the library writers to 
declare an object for use that the end-user would not have access 
to the implementation of. These are the D bindings I created:

// edsdk.d
struct EdsBaseRef;
alias EdsBaseRef EdsCameraListRef;
alias uint EdsUInt32;

extern (System):
EdsError EdsGetCameraList(EdsCameraListRef*);
EdsError EdsGetChildCount(EdsBaseRef*, EdsUInt32*);
EdsUInt32 EdsRelease(EdsBaseRef*);
//

Calling the functions using the bindings and the following code 
results in invalid pointer errors however (reported from the 
library):

// camera_list.d
import edsdk;

class CameraList
{
     private EdsCameraListRef* list;
     private EdsUInt32 _count = 0;
     this()
     {
         // Returns EDS_ERR_INVALID_POINTER
         EdsGetCameraList(list);
         // Returns EDS_ERR_INVALID_HANDLE
         EdsGetChildCount(list, &_count);
     }

     ~this()
     {
         EdsRelease(list);
     }

     final uint count()
     {
         return cast(uint) _count;
     }
}
//

What did I do wrong in constructing the bindings? If it helps the 
library provides a function called EdsRelease for cleaning-up 
allocated objects. Is the management of pointers between D and C 
the issue? Please forgive me if I've mangled that concept.


More information about the Digitalmars-d-learn mailing list