VB中一个很奇怪的问题(300分)

lnk 2003-05-15 11:44:01
我用Borland C写出的一个Dll:
int FAR PASCAL _export Xyz(unsigned long XStep,unsigned long YStep,
unsigned char XDir,unsigned char YDir,unsigned int AcceStep,
unsigned int MoveSpeed,unsigned int WholeSpeed)
.........
在Vb中调用:
如果在Form1中定义变量:
Private Znewx As Long, Znewy As Long, Movex_Dir As Integer, Movey_Dir As Integer
Private Direct As Integer, Speed As Integer, PubSpeed As Integer
然后再调用If Xyz(Znewx, Znewy, Movex_Dir, Movey_Dir, Direct, Speed, PubSpeed) = 1 Then
则运行后正常,生成EXE后调用则没有返回,死机。

如杲在Module1中定义为全局变量:
Public Znewx As Long, Znewy As Long, Movex_Dir As Integer, Movey_Dir As Integer
Public Direct As Integer, Speed As Integer, PubSpeed As Integer
然后再调用If Xyz(Znewx, Znewy, Movex_Dir, Movey_Dir, Direct, Speed, PubSpeed) = 1 Then
则在程序运行后调用则没有返回,死机。
如果参数不用变量,而是直接赋值,则运行和生成EXE都正常。
Xyz(5000, 4500, 1, 1, 20, 14, 100)

我开始怀凝是不是我的VB出了问题,我的电脑装的是Visual Studio6.0,但在另一台电脑是装的VB6.0
上试效果一样,我不知问题出在哪里?按理说在Form1中定义变量和在Module1中定义为全局变量所起作用
应是一样的。
但如杲把Direct,Speed,PubSpeed变量定义为Long,则运行和生成EXE都正常.
...全文
2 点赞 收藏 4
写回复
4 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
rainstormmaster 2003-05-16
变量应该总是被定义在尽可能小的范围内。全局 (Public) 变量可以导致极其复杂的状态机构,并且使一个应用程序的逻辑非常难于理解。全局变量也使代码的重用和维护更加困难。

Visual Basic 中的变量可以有下列范围:

范围 声明位置 可见位置
过程级 过程,子过程或函数过程中的 ‘Private’ 在声明它的过程中
模块级 窗体或代码模块(.frm、.bas )的声明部分中的 ‘Private’ 窗体或代码模块中的每一个过程
全局 代码模块(.bas)的声明部分中的 ‘Public’ 应用程序中的每一处


在 Visual Basic 的应用程序中,只有当没有其它方便途径在窗体之间共享数据时才使用全局变量。当必须使用全局变量时,在一个单一模块中声明它们,并按功能分组。给这个模块取一个有意义的名称,以指明它的作用,如 Public.bas。

较好的编码习惯是尽可能写模块化的代码。例如,如果应用程序显示一个对话框,就把要完成这一对话任务所需要的所有控件和代码放在单一的窗体中。这有助于将应用程序的代码组织在有用的组件中,并减小它运行时的开销。

除了全局变量(应该是不被传递的),过程和函数应该仅对传递给它们的对象操作。在过程中使用的全局变量应该在过程起始处的声明部分中标识出来。此外,应该用 ByVal 将参数传递给 Sub 过程及 function 过程,除非明显地需要改变已传递的参数值。

变量范围前缀
随着工程大小的增长,划分变量范围的工作也迅速增加。在类型前缀的前面放置单字母范围前缀标明了这种增长,但变量名的长度并没有增加很多。

范围 前缀 例子
全局 g gstrUserName
模块级 m mblnCalcInProgress
本地到过程 无 dblVelocity


如果一个变量在标准模块或窗体模块中被声明为 Public,那么该变量具有全局范围。如果一个变量在标准模块或窗体模块中被分别声明为 Private,那么该变量有模块级范围。

注意 一致性是卓有成效地使用这种技术的关键;Visual Basic 中的语法检查器不会捕捉以 "p." 开头的模块级变量

回复
lnk 2003-05-16
谢谢rainstormmaster兄,我已知道为什么要定义为Long(在VB API中有同样一帖),但我还想问一下:在Form1中定义变量和在Module1中定义为全局变量为什么会有不同的结杲,还有运行时可以为什么生成EXE都不行?
回复
richardbao 2003-05-15
你应该查一下你用的 Borland C 的数据类型字长,然后在 VB 里选用相对应的数据类型。
回复
Sean918 2003-05-15

Public Declare Function XyzLib "Xyz.dll" (ByVal XStep As Long, ByVal YStep As Long, XDir As Byte, ByVal YDir As Byte,Byval AcceStep as Integer,Byval MoveSpeed as Integer,Byval WholeSpeed as Integer) As Integer
回复
相关推荐
发帖
VB基础类
创建于2007-09-28

7490

社区成员

VB 基础类
申请成为版主
帖子事件
创建了帖子
2003-05-15 11:44
社区公告
暂无公告