Dll可以导出 宏、模板函数、模板类、typedef定义 吗?可以的怎么导? Dll可以导出 宏、模板函数、模板类、typedef定义 吗?可以的怎么导? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 要看你那个dll是什么dll咯一般dll生成的时候会有自己的.lib和.h的或者你直接import试一试 你说的这些都不是运行时的东西, 是属于编译期的. 而DLL 是一个可执行模块,它是运行期的东西, 跟你说的是两码事 to 楼上模板函数、模板类、typedef定义 都不是吗? krh2001(边城浪子) 说的没错宏、模板函数、模板类、typedef定义宏都不是运行时的东西与DLL的导出没关系 to 楼上你试试这样写:template __declspec( dllexport ) CString;编译是通过的。mfc的CString是模板类 你自己写的CString类不算,MFC写的才能叫mfc的CString类。 但最终生成DLL中只不会有模板的信息了 to jiangsheng(蒋晟.MSMVP2004Jan) 你自己写的CString类不算,MFC写的才能叫mfc的CString类。-------------------当然是指mfc的CString了,你自己先试试上面的代码就知道是谁的CString了,#include< cstringt.h > //atl的CStringT#include< sfxstr.h > //mfc的CStringclass __declspec( dllexport ) CString; //这样写是编译出错的template __declspec( dllexport ) CString; //这样写编译通过mfc的CString其实是atl的CStringT模板 oh,对了,大家上例中的CString不但是模板类,也同时是由 typedef定义 的。我想,你们说dll是运行时东西,但是当某工程链接dll后,在工程中的东西又都回到编译期了,至少可以再做成静态链接的exe文件。另外,上例中的 template 导出可以通过编译,这就值得我们研究一下template的导出了。 在编译template __declspec( dllexport ) CString;的时候,dllexport被编译器去掉了,因为模板类不会生成二进制代码。template __declspec( dllimport ) CString;也一样。这些声明的作用和template CString相同。 template __declspec( dllexport ) CString; 为了直接说明问题,使用了这个声明仅仅是名称上的引用,编译器当然会这样忽略性地处理了。事实上,这样导出任何的非模板类也只能导出其名称而已,而未能导出其函数、变量。如果你要看汇编代码,应该在上例的导出中增加模板类中的函数声明,即使是导出非模板类,也是需要这步的。 template __declspec( dllexport ) CString; 与class __declspec( dllexport ) CFile;2个写法都是一样会被编译其略掉的,因为都未导出成员函数。 Dll是不可以导出的,因为在Dll中这些东西在编译后都不会生成符号链接唯一的重用的方法是重用.h文件 给你讲一下吧:宏、模板函数、模板类、typedef定义均不会生成导出信息,是编译时使用的但:模板的实现类(函数)是可以被导出的模板类(函数)如果不是导出引用在不同的模块(段)中有不同的实现,即:你在a.exe中有T<double>类型,b.dll也会有T<double>类型,每个函数地址均不相同(使用不当就会导致程序出错)注:CString在.vc7.0后采用的点COM组件,可以跨段访问,在vc60的版本是不正确的,不能跨段访问 编译错误提示:语法错误 : “常数” VC滑动块的SetTicFreq为什么没用 VC++6.0的基于对话框框架程序,编译无问题,却无法显示对话框 怎么让窗口中的图形随着窗口变大缩小? 请高手指点, 有些什么方法可以减小生成的dll文件大小。 急~~大虾救命。。。。。。。。。。。。。。。。。。。。。。。。 #ifdef _WIN32是什么? 如何判断安装的操作系统的语言版本?! 在保护模式下,为什么应用程序还可以使用_outp()这样的访问端口函数?(100分) 关于DirectSound的问题. 新人的迷茫!!~请高手过来人指点!` 小小菜鸟,请叫一个菜鸟问题?
一般dll生成的时候会有自己的.lib和.h的
或者你直接import试一试
模板函数、模板类、typedef定义 都不是吗?
宏、模板函数、模板类、typedef定义宏都不是运行时的东西
与DLL的导出没关系
你试试这样写:template __declspec( dllexport ) CString;编译是通过的。mfc的CString是模板类
你自己写的CString类不算,MFC写的才能叫mfc的CString类。
-------------------
当然是指mfc的CString了,你自己先试试上面的代码就知道是谁的CString了,#include< cstringt.h > //atl的CStringT
#include< sfxstr.h > //mfc的CString
class __declspec( dllexport ) CString; //这样写是编译出错的template __declspec( dllexport ) CString; //这样写编译通过mfc的CString其实是atl的CStringT模板
我想,你们说dll是运行时东西,但是当某工程链接dll后,在工程中的东西又都回到编译期了,至少可以再做成静态链接的exe文件。另外,上例中的 template 导出可以通过编译,这就值得我们研究一下template的导出了。
为了直接说明问题,使用了这个声明仅仅是名称上的引用,编译器当然会这样忽略性地处理了。事实上,这样导出任何的非模板类也只能导出其名称而已,而未能导出其函数、变量。如果你要看汇编代码,应该在上例的导出中增加模板类中的函数声明,即使是导出非模板类,也是需要这步的。
与
class __declspec( dllexport ) CFile;2个写法都是一样会被编译其略掉的,因为都未导出成员函数。
唯一的重用的方法是重用.h文件
宏、模板函数、模板类、typedef定义均不会生成导出信息,是编译时使用的
但:模板的实现类(函数)是可以被导出的模板类(函数)如果不是导出引用在不同的模块(段)中有不同的实现,即:你在a.exe中有T<double>类型,b.dll也会有T<double>类型,每个函数地址均不相同(使用不当就会导致程序出错)注:
CString在.vc7.0后采用的点COM组件,可以跨段访问,在vc60的版本是不正确的,不能跨段访问