一般而言,我们会在dll接口,即使想要在内部实现某些更小模块也只消在继承该机口的类中添加功能函数,但是仅仅这样,该功能函数是不能暴露给外部使用的,其作用域只在类的内部,所以怎样才能给接口添加自定义函数,同时暴露出来呢?
这就要说到idl了,即interface description language,接口描述语言。
[
object,
uuid(D01D924C-FCFC-4309-A1AB-180E4A22324F),//IID_hInstance
dual,
nonextensible,
pointer_default(unique)
]
interface IhInstance : IDispatch{//表示他是一个自动化接口
HRESULT Msg(DWORD bg);
HRESULT Msg2(DWORD* know);
HRESULT PrintMsgW([unique][string][in]const wchar_t*);
};
[
uuid(70F0571D-85B7-4E7F-BE65-626DE932A3DB),//LIBD_customLib
version(1.0),
]
library customLib
{
importlib("stdole2.tlb");//引入其他类型库信息
[
uuid(0AED49B0-D7EA-4D87-90EF-9F404103A5F8) //CLSID_hInstance
]
coclass hInstance//对象类型信息
{
[default] interface IhInstance;//指定缺省接口如果还有其他接口 则,没有[default]
};
};
其中关键字"library"表示一个类型库,被其前面[]中的内容修饰,有一个GUID ,version和helpstring()/*可选*/
在coclass hInstance的{};中包含了该类型库支持的接口名称列表。
下面说下接口的信息,我们可以这样认为[]中的内容主要是为了修饰其后方的方法或者属性
例如为一个接口声明一个方法的话
[propget,helpstring("帮助说明符")]//这是修饰说明符propget,说明了该方法是要获得该接口的指定的属性值而propput修饰符,则是为了重新设置接口的属性值
其实我最想说的是在接口方法中对于参数的修饰符的说明
[in]输入参数
[out]输出参数
[unique]只有在参数为指针类型的时候才有用,即,允许指针类型的参数的实参值为NULL
[ref]该类型的指针参数必须为non-null,同时在函数执行过程中不能被改变,同时所有[out]类型的参数默认也被[ref]修饰
[ptr]和[unique]类似,但是可以使用别名
对于IDL支持的数据类型,一般都还行吧,笔者遇到的只有一个麻烦就是我想声明的是:
HRESULT PrintMsgA([unique][in]const char*);但是总出现不能实例化抽象基类的问题,最终通过修改变成了
HRESULT PrintMsgA([unique][in]const byte*);就通过了,虽然至今不知为什么,但也算是一个解决方案了
有朋友遇到的话可以试一下