支持多种语言的接口,这个法子可行吗?
http://www.codeproject.com/Articles/28969/HowTo-Export-C-classes-from-a-DLL
(C Language Approach 这一节讲解的)
这篇文章提供了一个法子, 以C语言的形式的导出c++类。
作者顺便提到:这种法子,可以让很多语言使用该dll
我不知道真假,因为不会其他语言
方法大概如下:
dll里的接口的
参数或者返回值类型
#ifdef _cplusplus
extern"C"
{
#endif
typedef tagMyHandle {} * MyHandle;
#ifdef _cplusplus
}
#endif
dll接口函数的参数类型是 MyHandle,通过MyHandle去 调用c++类。
一个接口函数:
MyHandle CreateObj()
{
CTest* pTest=new CTest(); //CTest是我们的类,屏蔽,不让用户知道,另外 很多编译器不支持c编译
return (MyHandle)pTest;
}
把CreateObj丢给用户
到达的好处:1.可以有效的保护c++代码,让用户不知道我们的关键代码,甚至类的声明都不知道!!!
2.由于用c编译方式提供 结构体,所以 很多语言应该支持可以识别这个MyHandle 。
这个法子可行吗?
------解决方案--------------------看windows核心编程
dll那章节提到过可以!
------解决方案--------------------嗯, 这个法子长常常用来为 c++ 的库, 提供 c api,
其实就是把 class 当作一个不透明的指针(句柄)了,
对象句柄由库创建, 调用时传递进去, 释放也由库完成.
------解决方案--------------------这个就是导出一个对象指针的方式,这样不需要一个个导出所有的函数,而只用h文件,就可以根据对象访问到对应的方法了.
------解决方案--------------------可行,但是这样对应成员函数的每个DLL导出函数都嘚带一个相当于this的句柄参数
临时需要把C++类做成C风格的DLL这样也能满足要求
------解决方案--------------------scintilla 做法跟这个类似。
------解决方案--------------------导出标准C接口就可以