VerySource

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1834|回复: 13

一个dll的调用问题,请高手过来探讨,vb6.0里可以用,如何在vb.net里调用!大家来看看!

[复制链接]

1

主题

7

帖子

3.00

积分

新手上路

Rank: 1

积分
3.00
发表于 2020-11-30 20:30:01 | 显示全部楼层 |阅读模式
最近做一个接口程序,他们硬件厂商提供了一个标准dll我们,就是一个转换10进制为16进制的函数.
   他们的dll中有一个函数 strtohex 就是把一个10进制转换为16进制
   他们的例程在vb6.0里如下调用 :
   dim s(2) as type
   dim str as string
   str="111111" '实际是一个时间
   call strtohex(str,s(0),2)
   调用了这个函数之后
   s(0)=17
   s(1)=17
   s(2)=17   就是取字符串的两位转成 16进制
  而在vb.net里调用这个函数
   执行的结果确是
   s(0)=0
   s(1)=0
   s(2)=0
压根就没做操作啊~请问各位高手,vb6.0和vb.net里的数组究竟什么区别啊!怎么会有这个结果!
回复

使用道具 举报

1

主题

7

帖子

3.00

积分

新手上路

Rank: 1

积分
3.00
 楼主| 发表于 2020-11-30 23:00:01 | 显示全部楼层
函数有三个参数,第二个是 byref 引用传递
回复

使用道具 举报

0

主题

1

帖子

2.00

积分

新手上路

Rank: 1

积分
2.00
发表于 2020-12-1 13:00:02 | 显示全部楼层
我才学vb.net两个月,说的不一定正确,我看书上说的,在vb.net中的数组多是按地址传递的,如果用byref的话就可以改变数组在内存中的位置.出现你说的情况,我想可能是那个dll文件把这个数组在内存中的位置改变了,vb.net对未初使化的变量自动设为0或空字符或者nothing.
回复

使用道具 举报

0

主题

9

帖子

6.00

积分

新手上路

Rank: 1

积分
6.00
发表于 2020-12-1 15:30:01 | 显示全部楼层
strtohex这个函数的声明贴出来
回复

使用道具 举报

1

主题

7

帖子

3.00

积分

新手上路

Rank: 1

积分
3.00
 楼主| 发表于 2020-12-1 17:15:01 | 显示全部楼层
public declare function strtohex lib "rfd.dll" alias strtothex(byval temp as object,byref commdhandle as object,wrlen as short)
这个就是声明,在vb6.0里是可以实现函数的效果的,但是转换成vb.net这个函数就出现问题了!
回复

使用道具 举报

0

主题

9

帖子

6.00

积分

新手上路

Rank: 1

积分
6.00
发表于 2020-12-1 17:30:01 | 显示全部楼层
你给出的是什么声明?是你自己转成.net的声明?
给vb6的声明或者C++的声明出来
回复

使用道具 举报

1

主题

7

帖子

3.00

积分

新手上路

Rank: 1

积分
3.00
 楼主| 发表于 2020-12-1 17:45:01 | 显示全部楼层
Public Declare Function strtohex Lib "rfdll.dll" (ByRef source As Any, ByRef target As Any, ByVal wrlen As Long) As Long


Public Declare Function wrkey_t5557 Lib "hotel1.dll" (ByVal commhandle As Long, ByRef keyinfo As Any) As Long


Public Type KeyStruc
    cardtype As Byte
    HotelID(2) As Byte   ' 酒店代号
    AreaID As Byte   ' 区域号
    FloorID As Byte ' 楼层号
    roomid As Byte ' 房间号
    CardID As Byte ' 卡序号
    OffOn As Byte '  "终止恢复标识
    SDate(4) As Byte '  "起始日期
    EDate(4) As Byte   '  "结束日期
    STime(1) As Byte  '  "服务起始时间
    ETime(1) As Byte '  "服务终止时间
    FloorCot As Byte '延续楼层数
End Type
KeyStruc 是自定义的机构,以上是在vb里做的啊.上面的函数的参数传递的就是这个结构里的一个成员,就是那个cardtype.
  如下:
   dim cinfo as keystruc
   with keystruc
       .cardtype=1
       .sdate(0)=&H18
    ...............
   endwith
   dim strtmp as string ="0701110805"
   '执行 strtohex
   call strtohex(strtmp,cinfo.sdate(0),5)
   执行上个句子之后
   cinfo.sdate成员值如下
   cinfo.sdate(0)=&H07
   cinfo.sdate(1)=&H01
   cinfo.sdate(2)=&H11
   依次类推.就是把cinfo.sdate数组的第一个元素传递给strtohex 得出如上结果.
   vb6.0是可以正确实现的.
但是在.net里就实现不了上面的结果,而是 cinfo.sdate的每个数组成员都是0
   
   strtohex(

回复

使用道具 举报

1

主题

7

帖子

3.00

积分

新手上路

Rank: 1

积分
3.00
 楼主| 发表于 2020-12-1 18:00:01 | 显示全部楼层
高手来看看啊,我就是不明白他们怎么传递的,估计还是参数传递上出现了问题啊 !
回复

使用道具 举报

1

主题

7

帖子

3.00

积分

新手上路

Rank: 1

积分
3.00
 楼主| 发表于 2020-12-1 18:15:01 | 显示全部楼层
vb6.0和vb.net 很多参数传递都做了更改吧!
回复

使用道具 举报

0

主题

9

帖子

6.00

积分

新手上路

Rank: 1

积分
6.00
发表于 2020-12-1 18:30:01 | 显示全部楼层
Public Declare Function strtohex Lib "rfdll.dll" (ByVal source As String, ByRef target As Byte, ByVal wrlen As Integer) As Integer
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|CopyRight © 2008-2023|verysource.com ( 京ICP备17048824号-1 )

快速回复 返回顶部 返回列表