迷惑:以ByVal的形式将String str传给一个API,执行完毕后,str获得新值,请问str的值为什么能改变呢?

flying_fox0 2003-08-28 12:12:34
迷惑:以ByVal的形式将String str传给一个API,执行完毕后,str获得新值,请问str的值为什么能改变呢?
...全文
60 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
Alicky 2003-08-28
  • 打赏
  • 举报
回复
你传的是地址,在API函数中,将该地址原来的值改变了。
  • 打赏
  • 举报
回复
学习!
up
道素 2003-08-28
  • 打赏
  • 举报
回复
我好像说错了
ByVal是“按值”调用,参数传递时,不将指向DLL的指针传递给参数变量本身,而是将传递参数值的一份拷贝传递给DLL。比如传递字符串参数时,VB与DLL之间的接口支持两种类型的字符串,如未使用ByVal关键字,VB将指向DLL的函数指针传递给一个OLE2.0字符串(即BSTR数据类型),而Windows API函数往往不支持这种数据类型,导致错误。而使用ByVal关键字后VB将字符串转变换成C语言格式的“空终止”串,被API正确使用。
liul17 2003-08-28
  • 打赏
  • 举报
回复
楼上所说甚是
射天狼 2003-08-28
  • 打赏
  • 举报
回复
API不受你按什么方式(地址,传值)的影响.
在VB中自定义函数可以.
飘零风 2003-08-28
  • 打赏
  • 举报
回复
是否改变,并不是由你调用的时候怎么写(ByVal or ByRef)来决定的,而是写API的时候决定的。如果API函数本身就是写成ByRef方式,即使你在声明的时候使用ByVal,也是不起作用的。
道素 2003-08-28
  • 打赏
  • 举报
回复
在调用api时,对于字符串类型的你必须以byval类型传递
就相当于传递地址,因为VB字符串变量其实是SAFEARRAY
TechnoFantasy 2003-08-28
  • 打赏
  • 举报
回复
VB中的字符串以C的眼光来看是指向指针的指针,所以Byval传递过去的实际是真实字符串内容所在的地址的指针(如果是ByRef的话传递的就是指向这个指针的指针)。直到指针当然就能修改其指向的地址的内容了。
DB类:数据库访问类 属性: ConnString——连接字符串(如:server=.;uid=sa;pwd=;database=ufdata_001_2010) CMDstring——未使用 oleConnString——连接ACCESS数据库的字符串 方法: OpenConn——打开数据库(无参数) oleOpenConn——打开ACCESS数据库 NoreturnCmdPara(Byval Str_cmdpara as string) 传递Sql命令为参数,无返回 Sub PROnoreturn(ByVal Str_proName As String, Optional ByVal Str_para1 As String = "", Optional ByVal Str_para2 As String = "", Optional ByVal Str_para3 As String = "", Optional ByVal Str_para4 As String = "", Optional ByVal Str_para5 As String = "", Optional ByVal Str_para6 As String = "") 执行存储过程Str_proName,无返回 函数: Function ReturnDatablePara(ByVal Str_cmdpara As String) as DataTable 传递Sql命令为参数,返回Datatable Function ReturnOneValuePara(ByVal Str_cmdpara As String) As Object 传递Sql命令为参数,返回单一 Function ReturnDataReaderPara(ByVal Str_cmdpara As String) As SQlClient.SqlDataReader 传递Sql命令为参数,返回DATAREADER Function ReturnXMLPara(ByVal Str_cmdpara As String) As Xml.XmlReader 传递Sql命令为参数,返回XML Function PROReturnDataReader(ByVal Str_proName As String, Optional ByVal Date_Begin As Date = #1/1/1900#, Optional ByVal Date_End As Date = #1/1/1900#, Optional ByVal Str_SubcompanyCid As String = "", Optional ByVal Str_Code As String = "", Optional ByVal Str_CompanyCid As String = "", Optional ByVal Str_ItemCid As String = "") As SqlClient.SqlDataReader 执行存储过程Str_proName,返回DATAREADER Function PROReturnDataTable(ByVal Str_proName As String, Optional ByVal Date_Begin As Date = #1/1/1900#, Optional ByVal Date_End As Date = #1/1/1900#, Optional ByVal Str_SubcompanyCid As String = "", Optional ByVal Str_Code As String = "", Optional ByVal Str_CompanyCid As String = "", Optional ByVal Str_ItemCid As String = "") As DataTable 执行存储过程Str_proName,返回DATATABLE 以ole开头的方法,用于访问ACCESS数据库 Tools类:工具 方法: 数字转中文大写 GetMonthDateMin:取月份最小日期,表示为:2018-01-01 00:00:00 GetMonthDateMax:取月份最大日期,表示为:2018-01-01 23:59:59 GetField:返回字符内容,如果为NULL,则返回为“” GetFieldNum:返回数内容,如果为NULL,则返回0 GetFieldNumEX:返回数内容,如果为NULL,则返回"" GetMacList:取本机的MAC地址列表 GetMaxDate:返回日期的最大时间 ,如:2018-01-05,则返回为:2018-01-05 23:59:59 GetMinDate:返回日期的最小时间 GetPaperLists:返回指定打印机的纸张列表 GetPrinterLists:返回指定本机打印机列表 加密字符串:将指定的字串,按参数2和参数3计算后返回结果, 原码必须小于等 于20位,参数2只能是1-6,参数3只能是1-100 解密字符串:与加密字符串对应,返回解密后的结果

7,789

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧