昨天说到dll和lib的关系,就有大牛跟我说,dll的lib跟头文件不是必须的,没有也是可以调用的,用dll+lib+头文件的方式,是隐式调用dll的方式,而还有另外一种显式调用dll的方式。
本着自己动手,丰衣足食的原则,我没有继续追问,今天查了资料,发现别有洞天。
经查,调用dll确实是由两种方式,隐式调用就是昨天说的在工程里面加上lib,然后引入头文件,就可以正常编译了,这里想了解下第二种,显式调用的方式.
显式调用是通过系统api来实现的,windows和Linux的不一样,这里以windows为例,
可以包含windows.h以后,使用LoadLibrary进行加载,加载完成以后的返回值是HINSTANCE,可以通过它是否为NULL判断是否加载成功了,加载成功以后可以通过GetProcAddress获取里面具体的函数,具体用法见后面附图。
不过这个用法很蛋疼,只能获取到函数,导出的类拿不到,拿不到的话其实意义不是很大,因为实际中我用到或者编写的更多是类,感觉不加上头文件编译器这关是过不了的。然后我又继续查,发现了另外一种用法,虚函数。这也是今晚最大的收获,具体用法如下:
将实现类封装,抽象出一个接口类,然后用实现类去继承它,然后写一个全局的Export函数,函数参数为空,返回值为虚函数指针,在里面new一个实现类的指针,并将其返回即可,同时将其导出。
然后在用到这个dll的工程里面引入接口头文件,按上面的用法获取Export函数并调用,这样就可以实现用接口的函数调实现类的函数了,实现了多态和封装,感觉棒棒的。
不过这么做这么麻烦,有什么好处呢?其实好处是有的ÿ