本篇文章解决如下问题:
动态库的导出函数带有字符参数,同时,还能支持“调用者在UNICODE和非UNICODE”下都可以使用。
1. 动态库
(1) 动态库的导出函数在动态库编译的时候,其参数TCHAR就已经根据"动态库自身"的UNICODE设置情况被解析为了char还是wchar,也就是说,在动态库自身编译的时候,导出函数要么是char的,要么是wchar的,却不可能是同时支持两种的.(动态库也是个独立程序,跟所有的程序一样,它被编译出来后,要么是UNICODE版本,要么是非UNICODE版本,它不可能俩都是).
(2)根据以上描述,如果想要动态库的导出函数既可以给UNICODE客户程序用也可以给非UNICODE客户程序用,那只能定义两个函数,拿OutString为例,需要定义一个OutStringA,其其函数内部调用的所有有关于字符串的操作都是char的,再定义一个OutStringW,其函数内部调用的所有有关于字符串的操作都是wchar的.让调用程序自己选择使用A还是W
2. 调用程序
(1)根据上述第(2)的描述,调用程序需要自己选择使用A还是W,但有时候"调用程序"需要编译生成两个版本,在编码的时候既要用A也要用W,那么比较方便的方式就是用宏了,
#ifdef _UNICODE
#define OutString OutStringW
#else
#define OutString OutStringA
#endif
这样的话,调用程序直接用OutString就可以了,传参的时候就可以用TCHAR了
(2)在使用静态链接方式使用动态库的时候,我们一般直接拿动态库的导出函数.h提供给用户程序,方便.所以,也就可以把上述宏定义直接放在动态库的导出.h中了,调用者直接拿来用,方便.所以,在这个地方,要澄清一个误解,不要认为动态库采用"UNICODE与否"编译会对调用程序的"UNICODE与否"产生要求.其实,不是的,因为动态库的导出函数都显示指定了是char还是wchar,所以用"UNICODE与否"编译没有什么区别,动态库也不会让调用程序在UNICODE上必须一致.