Dll可以导出 宏、模板函数、模板类、typedef定义 吗?可以的怎么导?

解决方案 »

  1.   

    要看你那个dll是什么dll咯
    一般dll生成的时候会有自己的.lib和.h的
    或者你直接import试一试
      

  2.   

    你说的这些都不是运行时的东西, 是属于编译期的. 而DLL 是一个可执行模块,它是运行期的东西, 跟你说的是两码事
      

  3.   

    to 楼上
    模板函数、模板类、typedef定义 都不是吗?
      

  4.   

    krh2001(边城浪子) 说的没错
    宏、模板函数、模板类、typedef定义宏都不是运行时的东西
    与DLL的导出没关系
      

  5.   

    to 楼上
    你试试这样写:template __declspec( dllexport ) CString;编译是通过的。mfc的CString是模板类
      

  6.   

    你自己写的CString类不算,MFC写的才能叫mfc的CString类。
      

  7.   

    但最终生成DLL中只不会有模板的信息了
      

  8.   

    to  jiangsheng(蒋晟.MSMVP2004Jan) 
    你自己写的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模板
      

  9.   

    oh,对了,大家上例中的CString不但是模板类,也同时是由 typedef定义 的。
    我想,你们说dll是运行时东西,但是当某工程链接dll后,在工程中的东西又都回到编译期了,至少可以再做成静态链接的exe文件。另外,上例中的 template 导出可以通过编译,这就值得我们研究一下template的导出了。
      

  10.   

    在编译template __declspec( dllexport ) CString;的时候,dllexport被编译器去掉了,因为模板类不会生成二进制代码。template __declspec( dllimport ) CString;也一样。这些声明的作用和template CString相同。
      

  11.   

    template __declspec( dllexport ) CString; 
    为了直接说明问题,使用了这个声明仅仅是名称上的引用,编译器当然会这样忽略性地处理了。事实上,这样导出任何的非模板类也只能导出其名称而已,而未能导出其函数、变量。如果你要看汇编代码,应该在上例的导出中增加模板类中的函数声明,即使是导出非模板类,也是需要这步的。
      

  12.   

    template __declspec( dllexport ) CString; 

    class __declspec( dllexport ) CFile;2个写法都是一样会被编译其略掉的,因为都未导出成员函数。
      

  13.   

    Dll是不可以导出的,因为在Dll中这些东西在编译后都不会生成符号链接
    唯一的重用的方法是重用.h文件
      

  14.   

    给你讲一下吧:
    宏、模板函数、模板类、typedef定义均不会生成导出信息,是编译时使用的
    但:模板的实现类(函数)是可以被导出的模板类(函数)如果不是导出引用在不同的模块(段)中有不同的实现,即:你在a.exe中有T<double>类型,b.dll也会有T<double>类型,每个函数地址均不相同(使用不当就会导致程序出错)注:
    CString在.vc7.0后采用的点COM组件,可以跨段访问,在vc60的版本是不正确的,不能跨段访问