Wrapping C++ class API for C consumption

后端 未结 6 1419
滥情空心
滥情空心 2020-12-02 08:07

I have a set of related C++ classes which must be wrapped and exported from a DLL in such a way that it can be easily consumed by C / FFI libraries. I\'m looking for some \"

6条回答
  •  清歌不尽
    2020-12-02 08:25

    Some opinions from my experience:

    • functions should return codes to represent errors. It's useful to have a function returning error description in string form. All other return values should be out parameters.

    E.g.:

    C_ERROR BuildWidget(HUI ui, HWIDGET* pWidget);
    
    • put signatures into structures/classes your handles pointer to for checking handles on validness.

    E.g. your function should look like:

    C_ERROR BuildWidget(HUI ui, HWIDGET* pWidget){
        Ui* ui = (Ui*)ui;
        if(ui.Signature != 1234)
        return BAD_HUI;
    }
    
    • objects should be created and released using functions exported from DLL, since memory allocation method in DLL and consuming app can differ.

    E.g.:

    C_ERROR CreateUi(HUI* ui);
    C_ERROR CloseUi(HUI hui); // usually error codes don't matter here, so may use void
    
    • if you are allocating memory for some buffer or other data that may be required to persist outside of your library, provide size of this buffer/data. This way users can save it to disk, DB or wherever they want without hacking into your internals to find out actual size. Otherwise you'll eventually need to provide your own file I/O api which users will use only to convert your data to byte array of known size.

    E.g.:

    C_ERROR CreateBitmap(HUI* ui, SIZE size, char** pBmpBuffer, int* pSize);
    
    • if your objects has some typical representation outside of your C++ library, provide a mean of converting to this representation (e.g. if you have some class Image and provide access to it via HIMG handle, provide functions to convert it to and from e.g. windows HBITMAP). This will simplify integration with existing API.

    E.g.

    C_ERROR BitmapToHBITMAP(HUI* ui, char* bmpBuffer, int size, HBITMAP* phBmp);
    

提交回复
热议问题