在VB、VC中不一致的TRUE和FALSE

ZDNet软件频道 时间:2002-11-04 作者:盛放 |  我要评论()
本文关键词:shengfang
无论是用VB编程,还是用VC编程,大家对布尔类型非常熟悉了,可是大家是否注意到这布尔类型在VB和VC中的不同之处?

无论是用VB编程,还是用VC编程,大家对布尔类型非常熟悉了,可是大家是否注意到这布尔类型在VB和VC中的不同之处?

请看如下代码:

UINT MakePdu(BOOL b)
{
 if (b==TRUE)
   AfxMessageBox("TRUE");
 else
   AfxMessageBox("FASLE");
 return 1;
}

这是一段非常简单的代码,根据布尔类型参数分别弹出不同的对话框,如果你只是在VC中使用这段代码,那么不会有问题,可是,如果你制作成DLL提供给VB调用,那么就会发现问题了(其实我个人认为这段代码还存在一个比较大的问题)。

用VC新建一个WIN32 DLL工程:BlDll,加入上面那段代码(记得在函数申明中加入 WINAPI),在DEF文件中EXPORTS后加入MAKEPDU以导出函数,编译生成BLDLL.DLL文件。

用VB新建一个标准EXE:TSTBLDLL,在窗体加入一个按钮,然后增加如下代码:

Private Declare
Function MakePdu Lib "BLDL.dll" (ByVal b As Boolean) As Integer

(如果你不喜欢将DLL拷贝到系统目录下,那么应该加上文件所在的目录名)

Private Sub Command1_Click()
MakePdu True
MakePdu False
End Sub

这段代码也非常简单,申明MAKEPDU函数,然后在点击按钮中调用,传递VB的布尔类型作为参数。

根据上面的VC代码,我们可以预测到按下按钮后应该先弹出TRUE的对话框,再弹出FALSE对话框。那么请按下按钮吧。

很吃惊吧,让你失望了,弹出的是两个FALSE对话框!

现在让我们开始调试DLL找出原因。

首先关掉VB(当然要保存工程文件)

在VC的if (b==TRUE)处按下F9键设置断点,然后按下F5键开始执行DLL,当然DLL不能执行,VC会提示选择一个执行文件进行调试,选择VB6.EXE。

在VB中打开TSTBLDLL工程,运行并按下按钮。

在VC中你会发现原来VB传过来的True并不是如同想象中一样是1,而是0xffffffff。

现在真相大白了,在VC中布尔类型的TRUE就是1,而在VB中却是-1!

因此我们在编制VC动态连接库提供VB调用时,请注意不要使用布尔类型,用别的类型进行替代。

其实有一个更简单的解决办法,因为不论是VC还是VB,都会把0认为是FALSE,其他非0值认为是TRUE,因此只要把if (b==TRUE)改为if(b)也可以让程序执行正常。但是本人保留这种做法,一个从代码角度来讲,对于别人使用上,很容易让人产生混淆,究竟是满足那种条件代表TRUE呢?另外一个在可扩充性上比较差,因为使用BOOL意味着只能满足两种条件,如果以后条件进行了扩展,布尔类型就没有办法解决了。当然,这只是我个人的看法,希望和大家讨论。



责任编辑:炒饭

欢迎评论或投稿


百度大联盟认证黄金会员Copyright© 1997- CNET Networks 版权所有。 ZDNet 是CNET Networks公司注册服务商标。
中华人民共和国电信与信息服务业务经营许可证编号:京ICP证010391号 京ICP备09041801号-159
京公网安备:1101082134