多谢指教
俺是新手

解决方案 »

  1.   

    呵呵,
    一看到你的这个问题就知道真的是新手。
    首先,Lib文件不是可执行文件,里面没有可执行部分。你知道DLL吧,实际上DLL是个二进制文件,里面有可执行代码、资源等等。但是我们的调用程序如何知道从哪里开始执行该二进制文件哩?这时候必须给定一个接口,告诉调用DLL文件的程序在调用的时候从哪里开始进入,或者说DLL中导出的函数入口有哪些。这时候才引入了Lib文件,因此Lib文件实际上是DLL导出函数的定义。
    至于你的想用DLL导出一个类,我不太明白你的意思,如果是一个类的话,完全可以将类的声明文件和实现文件包含到另一个项目中去。这样类就有了。当然如果你不想让别人看到你的类的实现就令当别论了。我的做法是在DLL中定义一个基类:
    class Base {
       public:
          Base() {} 
         ~Base() {}
         virtual int func1(int xxx,float xxx) {return 0;}
         virtual int func2(void) {}
    };
    然后,根据派生类可以根据C++的多态性,声明基类的派生类,将基类的虚拟函数全部实现:
    class Derive : public Base {
       Derive() {}
       ~Derive() {}
       int func1(int xxx,float xxx) {....}  // 具体实现
       int func2(void) {.....}   // 具体实现
    }
    然后声明一个对象的导出函数:
    extern "C" __declspec(dllexport) Derive * CreateObj()
    {
         return new Derive ;
    }
    在你的项目中先要加入生成的Lib文件,然后加入基类的定义文件例如:
    #include "Base.h"
    class Derive : public Base ; // 注意这个是要先声明Derive类是从Base
                                 //类中派生出来的
    class xxxxxView : public CView
    {
     ...
    //声明一个基类的指针
    Base *m_pBase ;
    };
    在实现文件中加上导入函数的声明:
    extern "C" __declspec(dllimport) Derive * CreateObj() ;
    然后你就可以使用了:
    CxxxView::OnTestXXX()
    {
        m_pBase = CreateObj();
        m_pBase->func1(2,3);
        m_pBase->func2();
        delete m_pBase ;
    }
    就可以了。这样可以导出派生类的虚拟函数覆盖基类的函数,又可以保护你的Derive类的实现细节。我已经做过试验了,VC6下面没有问题。
      

  2.   

    新建一个lib工程
    把你的文件的.h和cpp包进去,编译就搞顶了
    不过如上面仁兄说的,你要的是不是不是这个呀!
      

  3.   

    我的类本来就在.h中亚,而且是从cstatic继承的,我现在的问题不是怎么用这个lib,而是如何生成lib,如果设置这个工程