我有一个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中更改不算数?
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中更改不算数?
解决方案 »
- 如何根据列表框的窗口句柄来调用列表框的函数?
- 在改变窗口大小时,我同步修改了控件的位置,导致界面变花了,怎办?
- 在VC6.0中我做了一个窗体界面,加载菜单总是不能显示是什么问题,请帮忙,非常感谢。
- 如何调试输入法软件?
- 如果我的程序对话框弹出对话框,我的程序怎么可以得到最上层的对话框是什么?
- 小弟不才,学了VC一小段时间,终于写了个小东西,请大家指点指点
- 如何提取资源类例如GIF图片的句柄并对其操作?
- 救命啊!我10%的分呐
- 急!简单问题!送分!关于改变对话框标题栏文字
- CTreeCtrl小问题,还没解决
- dialog上的一个CHyperLink,但是拖动窗口的时候,这个连接会看不见,鼠标挪上去,就能看见了,为什么?
- 怎样更新对话框中的CListCtrl
myclass::OnRun(CString& s, int t)
{
CString tmp; //局部变量
tmp = s; //此处正确
str = tmp; //此处仍旧出错,不能给类成员赋值, 为什么?
}这里str = tmp;应该改为temp是CString的一个实例,str是什么类型,检查一下
两个CString之间可以赋值,类重载了这个方法
成员变量是类的成员变量,使用如ClassInstance.var;
局部变量直接定义使用即可
不知道说明白没
不行可以google一下
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,原因嘛,上面已经有人说了。
{
num = t;
str = s;
}
//把顺序调整一下试试,
经过一周的调试,发现如果DLL中的函数中某个参数直接使用了exe的成员变量,则肯定会有莫名其妙的错误。
也就是说,exe调用dll的时候,dll中的函数不能使用exe的成员变量。
我总结出以下经验:
在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]; //赋值给类成员变量 改了之后运行就没有任何问题了。请问高手这究竟是什么问题啊!
希望高手给予解释阿!