在C ++ DLL中使用C风格导出API之间的公共类的方法

时间:2017-01-15 11:38:59

标签: c++ c dll global-variables dllexport

我正在编写C ++库,现在为它设计C风格的API。现在我有一堆使用主类单例的方法,这里简化声明:

extern "C" {
    MYDLL_API void getAudioDeviceList();
    MYDLL_API void getWindowList();

    MYDLL_API uint32_t BeginVideoCapture();
    MYDLL_API uint32_t StopVideoCapture();
}

但到目前为止,我决定删除单身人士,这就是困境。通过API调用使用我的类最优雅的方法是什么?现在我只看到一种方法,使用全局变量和init方法,比如(其中CVideoConverter它在C ++类下的C结构包装):

extern "C" {
    CVideoConverter* t = new CVideoConverter();

    MYDLL_API void getAudioDeviceList();
    MYDLL_API void getWindowList();

    MYDLL_API uint32_t BeginVideoCapture();
    MYDLL_API uint32_t StopVideoCapture();
}

或者我应该创建一些C结构,它将包含所有API方法和指向CVideoConverter对象的指针,即导出结构本身。等待你的建议,谢谢!

2 个答案:

答案 0 :(得分:1)

在头文件中定义全局变量永远不会带来快乐。相反,如果您想要C ++代码的C API,我建议您实际查看FILE和标准C文件处理函数。

FILE类型别名是不透明结构,您不知道其内容,也不关心。相反,你有一个函数,它分配一个不透明结构的实例并返回一个指向它的指针。然后,所有C API函数都将此指针作为参数。

这种不透明的结构究竟是什么?它并不重要,它可能只是一个包含主类实例的私有结构。然后,具有结构和类的完整定义的C API函数可以使用它来调用所需的成员函数。

一个简单的小例子:

public 头文件,这是C应用程序应包含的内容:

#ifndef MY_C_API_H
#define MY_C_API_H

#ifdef __cplusplus
extern "C" {
#endif

// Forward declaration of the MYSTRUCT structure, and definition of type-alias
typedef struct MYSTRUCT MYSTRUCT;

MYSTRUCT *my_create(void);
void my_destroy(MYSTRUCT *mystruct);
void my_do_something(MYSTRUCT *mystruct, int some_argument);

#ifdef __cplusplus
}
#endif

#endif // End of header include guard

私有 标头文件,仅供您的应用程序在内部使用:

#ifndef MY_PRIVATE_H
#define MY_PRIVATE_H

#include "my_c_api.h"
#include "my_class.h"

struct MYSTRUCT
{
    MyClass my_object;
};

#endif

C API的实现:

#include "my_private.h"

extern "C"
{
    MYSTRUCT *my_create(void)
    {
        return new MYSTRUCT;
    }

    void my_destroy(MYSTRUCT *mystruct)
    {
        delete mystruct;
    }

    void my_do_something(MYSTRUCT *mystruct, int some_argument)
    {
        mystruct->my_object.do_something(some_argument);
    }
}

答案 1 :(得分:0)

一个好的方法(不是唯一的方法)是提供类CVideoConverter的实例工厂函数,它将通过reinterpret_cast返回转换后的C实例。这样,您可以通过将此实例引用作为第一个参数来调用C导出函数。在DLL端,您可以重新键入C ++实例并调用实例的方法。

请点击此链接,提供更详细的解释和非常好的例子。

C++ DLL to be used in C program