无论是用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意味着只能满足两种条件,如果以后条件进行了扩展,布尔类型就没有办法解决了。当然,这只是我个人的看法,希望和大家讨论。