无论是用VB编程,还是用VC编程,http://www.shengfang.org大家对布尔类型非常熟悉了,可是大家是否注意到这布尔类型在VB和VC中的不同之处? 请看如下代码: UINT MakePdu(BOOL b) 用VC新建一个WIN32 DLL工程:BlDll,加入上面那段代码(记得在函数申明中加入 WINAPI),在DEF文件中EXPORTS后加入MAKEPDU以导出函数,http://www.shengfang.org编译生成BLDLL.DLL文件。 用VB新建一个标准EXE:TSTBLDLL,http://www.shengfang.org在窗体加入一个按钮,然后增加如下代码: Private Declare Private Sub Command1_Click() 这段代码也非常简单,http://www.shengfang.org申明MAKEPDU函数,然后在点击按钮中调用,传递VB的布尔类型作为参数。 根据上面的VC代码,http://www.shengfang.org我们可以预测到按下按钮后应该先弹出TRUE的对话框,再弹出FALSE对话框。那么请按下按钮吧。 很吃惊吧,让你失望了,弹出的是两个FALSE对话框! 现在让我们开始调试DLL找出原因。http://www.shengfang.org 首先关掉VB(当然要保存工程文件) 在VC的if (b==TRUE)处按下F9键设置断点,http://www.shengfang.org然后按下F5键开始执行DLL,当然DLL不能执行,VC会提示选择一个执行文件进行调试,选择VB6.EXE。 在VB中打开TSTBLDLL工程,运行并按下按钮。http://www.shengfang.org 在VC中你会发现原来VB传过来的True并不是如同想象中一样是1,而是0xffffffff。 现在真相大白了,在VC中布尔类型的TRUE就是1,而在VB中却是-1! 因此我们在编制VC动态连接库提供VB调用时,请注意不要使用布尔类型,用别的类型进行替代。 其实有一个更简单的解决办法,http://www.shengfang.org因为不论是VC还是VB,都会把0认为是FALSE,其他非0值认为是TRUE,因此只要把if (b==TRUE)改为if(b)也可以让程序执行正常。但是本人保留这种做法,一个从代码角度来讲,对于别人使用上,很容易让人产生混淆,究竟是满足那种条件代表TRUE呢?另外一个在可扩充性上比较差,因为使用BOOL意味着只能满足两种条件,如果以后条件进行了扩展,布尔类型就没有办法解决了。当然,http://www.shengfang.org这只是我个人的看法,希望和大家讨论。 字体:大 中 小 |
![]() | 永久地址 http://www.shengfang.org/blog/p/vb6vc6truefalse.php |
![]() | 引用地址 http://www.shengfang.org/blog/tb.php?tb_id=1110950972 |
2005年3月16日13:29星期三 [Dev开发]





