我有一个MFC扩展DLL,如下:
class AFX_EXT_CLASS myclass
{   private:
      int   num;
      CString  str;   public:
      void  OnInit(int t);
      void  OnRun(CString&  s, int  t);
}
.cpp文件:
myclass::OnInit(int t)
{
    num = t;
}
myclass::OnRun(CString&  s, int  t)
{
    str = s;   //此处出错
    num = t;   //此处值不正确
}在应用程序中调用:
.h文件  myclass   obj;
.cpp文件    obj.OnRun();上面有两个出错的地方,但是把函数改成下面的则运行通过:
myclass::OnRun(CString&  s, int  t)
{
    CString   tmp;  //局部变量
    tmp = s;   //此处正确
    str = tmp;  //此处仍旧出错,不能给类成员赋值, 为什么?
}
另外:  对于int型成员变量,如下连续调用两次:
int  k = 10;  
myclass.OnInit(10);   //进入dll调试发现num已经被赋值为10设OnRun()函数如下:
myclass::OnRun(CString&  s, int  t)
{
    int  k = 2000/num;
}
则进入上面函数的时候,发现num为0, 在OnInit()函数中赋得的值10已经变了。  实在搞不懂类成员变量和局部变量有何区别,为什么类成员变量的值不能确定,而且str对象还不能被赋值?
是不是在myclass   obj;定义的时候,dll中的类成员变量就被指定到应用程序中去了,所以在dll中更改不算数?

解决方案 »

  1.   

    本来就是调用才出错的啊, DLL是正常编译通过的啊。至于怎么调用,请看上面的描述!
      

  2.   

    str = *&s;最好别传递CString&参数,改成传递LPCTSTR
      

  3.   

    不要在参数中使用类,很有可能编译器在dll和exe处理的时候出现错误。
      

  4.   

    上面有两个出错的地方,但是把函数改成下面的则运行通过: 
    myclass::OnRun(CString&  s, int  t) 

        CString   tmp;  //局部变量 
        tmp = s;   //此处正确 
        str = tmp;  //此处仍旧出错,不能给类成员赋值, 为什么? 
    }这里str = tmp;应该改为temp是CString的一个实例,str是什么类型,检查一下
    两个CString之间可以赋值,类重载了这个方法
    成员变量是类的成员变量,使用如ClassInstance.var;
    局部变量直接定义使用即可
    不知道说明白没
    不行可以google一下
      

  5.   

    我有一个MFC扩展DLL,如下: 
    class AFX_EXT_CLASS myclass 
    {    private: 
          int   num; 
          CString  str;    public: 
          void  OnInit(int t); 
          void  OnRun(CString&  s, int  t); 

     
    =============================================LZ,请确保你这个类定义文件在你的EXE工程中也完全一致(AFX_EXT_CLASS 不要)!你千万不要为了“保密”而在EXE工程中的文件中,把一些成员变量和虚函数给省了!另外:类似接口参数不宜用类或STL,原因嘛,上面已经有人说了。
      

  6.   

    myclass::OnRun(CString&  s, int  t) 

         num = t; 
        str = s;        

    //把顺序调整一下试试,
      

  7.   

    你这个说法是错误的, 在exe工程中的文件中,私有的成员变量及函数全部可以省略,这个是我验证了的。
    经过一周的调试,发现如果DLL中的函数中某个参数直接使用了exe的成员变量,则肯定会有莫名其妙的错误。
    也就是说,exe调用dll的时候,dll中的函数不能使用exe的成员变量。
      

  8.   

    最新研究成果:
     
       我总结出以下经验: 
       在exe中调用dll中的函数的时候, dll中函数的参数不能使用exe的成员变量,否则会出错。
    例如:
    dll中:
        class AFX_EXT_CLASS MyDll
        {
            public:
        void  myFunc(double dw[5]);
         }
            
    exe中:  
        Class Myexe
       {  
           public:
             double aa[5];
        }
    exe中调用dll:
       MyDll  my;
       my.myFunc(aa);   //编译通过,但是会使exe失去实例,以后运行中会出现很多bug  只好改成这样:  
      MyDll  my;
      double bb[5];    //定义局部变量
      my.myFunc(bb);  //使用局部变量
      for(int i=0;i<5;i++)
         aa[i] = bb[i];   //赋值给类成员变量  改了之后运行就没有任何问题了。请问高手这究竟是什么问题啊!  
    希望高手给予解释阿!