引用一个动态库DLL,出参为unsigned char *XXX , 出参取出来就是乱码

tamgoguanok 2018-10-31 06:04:44
给的动态库说明是 : int getRandom(int sConnect,int sRandomLen,unsigned char *random)

想问问, unsigned char *random 这个是传的是地址还是值。不懂C啊。

入参:sConnect ,sRandomLen
出参: random

我的VB代码:
'模块里声明
Public Declare Function getRandom Lib "XXX.dll" (ByVal sConnect As Long, ByVal sRandomLen As Long, ByVal random As String) As Long

'按键里的代码
dim handleID as long
dim ShuiJiShu as long
dim wholeStr as string

ShuiJiShu = 8 '临时随便赋值,约定的8个字节
handleID = 12321 '临时随便赋值,这个和问的应该无关
wholeStr = space(ShuiJiShu)

Select Case getRandom(handleID, ShuiJiShu, wholeStr)

Case 0

MsgBox wholeStr

MsgBox "成功读取"
Case -1
MsgBox "传入句柄有误"
Case -2
MsgBox "读取失败"

End Select

这样读出来的WholeStr就是乱码
...全文
174 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
tamgoguanok 2018-11-01
  • 打赏
  • 举报
回复
那链接库就简单给个说明文件。 还说是通用的,只能摸着头皮上了。 谢谢你,结贴先。
舉杯邀明月 2018-11-01
  • 打赏
  • 举报
回复
目前试过的,感觉只有 UTF-7 编码的看起来稍微象样点。
UTF-7 那个也许不能算“乱码”。

舉杯邀明月 2018-11-01
  • 打赏
  • 举报
回复
叫你把那个缓冲区分配大点 ……
反正多几字节内存,也不会多花你1分钱 !



你贴出来的那8字节数据,我试了几种编码格式,都是乱码。
也不清楚你的那个函数接口究竟是返回什么数据的……
你看过它的说明吗?
 你确定它在“正常”的情况下,返回的是“正规文本”字符?
tamgoguanok 2018-10-31
  • 打赏
  • 举报
回复
用chr()把值转成字符,好像也不太对。
tamgoguanok 2018-10-31
  • 打赏
  • 举报
回复
谢谢你提醒! 原来那些不是乱码,是ASCII扩展字符,搞到我一直以为是乱码。新手,很少用监控,一直调试都用的 msgbox。 再试一下之前的 byval XX as string 看看。
舉杯邀明月 2018-10-31
  • 打赏
  • 举报
回复
贴一张很久以前的图片给你看看。

舉杯邀明月 2018-10-31
  • 打赏
  • 举报
回复
引用 3 楼 tamgoguanok 的回复:
拿到的这个varptr(arrBuffer(0)) 是内存地址吗? 怎么通过这个指针地址把内存里目标的8个字符字节拿出来呢? 搞了一下午,很是郁闷。


还要怎么去“拿”……
直接看 arrBuffer( )中的内容啊 !


不知道“输出变量值”?
不知道 debug.print 么?
不知道“监视窗口”么……


tamgoguanok 2018-10-31
  • 打赏
  • 举报
回复
拿到的这个varptr(arrBuffer(0)) 是内存地址吗? 怎么通过这个指针地址把内存里目标的8个字符字节拿出来呢? 搞了一下午,很是郁闷。
tamgoguanok 2018-10-31
  • 打赏
  • 举报
回复
谢谢舉杯邀明月的回复, 动态库哪里约定是8字节的,应该是英文字符,不是中文的。 我试试按你的来看能否把出参拿出来。现在就是不明白,那个出参,出来的是内存地址还是值。
舉杯邀明月 2018-10-31
  • 打赏
  • 举报
回复
按“一般理论”来说,你的这个用法应该没什么问题,应该这样用。



不过,建议先“试验一下”:

首先:API声明更改一下,
Public Declare Function getRandom Lib "XXX.dll" ( _
ByVal sConnect As Long, _
ByVal sRandomLen As Long, _
ByVal random As long) As Long

也就是先把第3个参数从 String类型,改为 Long类型。

然后,调用测试,
dim arrBuffer() as byte

redim arrBuffer( N )    注意这个 N的值……

ShuiJiShu = 8 '临时随便赋值,约定的8个字节
handleID = 12321 '临时随便赋值,这个和问的应该无关

Select Case getRandom(handleID, ShuiJiShu, varptr(arrBuffer(0)))
 . . . . . . . . . . .



现在说一下N值的取值问题:
因为你之前的“正常使用方式”,会出现“乱码”,那么会不会是“编码”问题呢?
(不过一般“英文”用什编码,都不会“乱码”呀,难道会是中文的、并且不是ANSI格式?)
那么按“长度”给它先分配一个足够大的缓冲区。
按“字符数”×3 + 4 来取分配大小,
比如你的 ShuiJiShu = 8 ,那么就是分配28字节: redim arrBuffer(27)
然后,在调用API之后,看这个数组中的数据具体是什么,再做下一步的分析……

1,486

社区成员

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

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