最近我要完成一个动态库
里面包括很多的.h文件,每个文件都有类,而且类都是要在外面使用的
如何创建一个这样的一个DLL
并且说明怎么调用
大家帮帮忙,谢谢!

解决方案 »

  1.   

    使用__declspec( dllexport )声明需要导出的类
    Using dllimport and dllexport in C++ ClassesSee Also
    dllexport, dllimport
    Microsoft SpecificYou can declare C++ classes with the dllimport or dllexport attribute. These forms imply that the entire class is imported or exported. Classes exported this way are called exportable classes.The following example defines an exportable class. All its member functions and static data are exported:#define DllExport   __declspec( dllexport )class DllExport C
    {
       int i;
       virtual int func( void )
       { return 1; }
    };
    Note that explicit use of the dllimport and dllexport attributes on members of an exportable class is prohibited.dllexport Classes
      

  2.   

    看看PlatformSDK的示例和些系统编程,Windows编程之类的书吧。
      

  3.   

    是不是对每个类都要使用_declspec(dllexport)还有:
    我创建了一个win32dll项目:TransForm
    然后在项目里面有dll1.h,dll2.h两个文件
    分别有Cdll1和Cdll2两个类
    而且这两个类都要在外面用到,我这么实现他们
    在C#中怎么调用.!!!!
      

  4.   

    用_declspec(dllexport)导出类,然后在外部工程包含你的类的头文件,引入.lib文件,然后直接用类声明对象,调用成员函数。。
      

  5.   

    参考:
    如何在VC中导出类,这是一个常有人问起的问题,下面我以一个简单的例子来说明这个问题: 首先使用Wizard创建一个Win32 Dynamic-Link Library工程,然后定义一个简单的C++类CInDLL。由于该类会被工程之外的文件所引用,所以需要对这个类进行引出。因为只有引出后所生成的DLL中才带有供足够的信息以在连接和运行时被正确引入到进程空间中。有两种方法可以引出类,使用__declspec(dllexport)定义和使用定义文件。 下面先讲使用__declspec(dllexport)的方法:将类定义改为:class __declspec(dllexport) CInDLL 就可以了。(译者:你也许不相信会有这么简单,我也不相信。:-) 这样产生的工程在编译时是正确的但是在使用时会产生错误,因为你包含的头文件中也是使用__declspec(dllexport),而使用这个DLL的工程中并没有引出这个类,而是需要引入这个类)在使用时需要将类定义改为class __declspec(dllimport) CInDLL就可以了。 使用定义文件可以有效的避免这个问题,这种方法是利用宏定义在不同的地方产生不同的编译代码:在头文件中加入如下的代码:
    #ifdef _CLASSINDLL
       #define CLASSINDLL_CLASS_DECL     __declspec(dllexport)
    #else
       #define CLASSINDLL_CLASS_DECL     __declspec(dllimport)
    #endif#endif // ClassInDLL_H
    //将class __declspec(dllexport) CInDLL改为
    class CLASSINDLL_CLASS_DECL CInDLL
    {
    CInDLL();
    ...
    }在实现这个类的CPP文件的顶部加入#define _CLASSINDLL语句。 #define _CLASSINDLL
    CInDLL::CInDLL()
    {
    }
    ...这样一来在使用这个类时就可以不做任何改动了。
      

  6.   

    是不是对每个类都要使用_declspec(dllexport)
    是的,每个导出的类,都要有这个标记,在c#中怎么调用我不知道,如果在vc中调用的话,
    把产生动态连接库时产生的.LIB文件加入到应用程序的工程中,想使用DLL中的函数时,只须说明一下。下面这段东西希望对你有帮助 MFC提供了一些宏,就有这样的作用。AFX_CLASS_IMPORT:__declspec(dllexport)
     
    AFX_API_IMPORT:__declspec(dllexport)
     
    AFX_DATA_IMPORT:__declspec(dllexport)
     
    AFX_CLASS_EXPORT:__declspec(dllexport)
     
    AFX_API_EXPORT:__declspec(dllexport)
     
    AFX_DATA_EXPORT:__declspec(dllexport)
     
    AFX_EXT_CLASS:
     #ifdef _AFXEXT 
        AFX_CLASS_EXPORT
        #else
        AFX_CLASS_IMPORT
     
    AFX_EXT_API:#ifdef _AFXEXT
        AFX_API_EXPORT
        #else
        AFX_API_IMPORT
     
    AFX_EXT_DATA:#ifdef _AFXEXT
         AFX_DATA_EXPORT
         #else
         AFX_DATA_IMPORT 像AFX_EXT_CLASS这样的宏,如果用于DLL应用程序的实现中,则表示输出(因为_AFX_EXT被定义,通常是在编译器的标识参数中指定该选项/D_AFX_EXT);如果用于使用DLL的应用程序中,则表示输入(_AFX_EXT没有定义)。 要输出整个的类,对类使用_declspec(_dllexpot);要输出类的成员函数,则对该函数使用_declspec(_dllexport)。如:class AFX_EXT_CLASS CTextDoc : public CDocument
    {
     …
    }
      

  7.   

    呵呵这句话要理解 像AFX_EXT_CLASS这样的宏,如果用于DLL应用程序的实现中,则表示输出(因为_AFX_EXT被定义,通常是在编译器的标识参数中指定该选项/D_AFX_EXT);如果用于使用DLL的应用程序中,则表示输入(_AFX_EXT没有定义)。
      

  8.   

    如果有多个.h文件,我是不是要在每个文件里都要写dllmain函数
      

  9.   

    不是,一个工程一个dllmain一个工程可以导出多个类