vb.net 中如何将Byte数组地址作为参数传给C++ dll

ccbaor 2014-05-22 05:32:44
我的是vb.net x64,c++ dll中,函数参数为 byte*。vb.net函数声明中的参数是这样写的 byref buffer as byte。调用代码如下:
Dim buffer(64) As Byte
Dim str1 As String = "how do you turn this on"
For i = 0 To str1.Length - 1
'buffer(i) = Convert.ToByte(str1.Chars(i))
Next
函数调用时的参数是这样写的 buffer(0)
以上如果在32位的环境中是正常的,但是64环境下,dll中就只得到了buffer(0)的值,后面的值没有得到。
参考帖子http://bbs.csdn.net/topics/390067304中的6楼,字符数组赋值改用
Dim code As System.Text.Encoding = System.Text.Encoding.ASCII
buffer = code.GetBytes(str1)
'buffer(str1.Length) = 0
仍然没有起到效果,
这个问题网上似乎有很多,但是没有找到一个很好的解决办法,哪位大神来指点一下出现这个问题的具体原因和解决方法,不胜感谢!!
...全文
419 6 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
ccbaor 2014-05-26
  • 打赏
  • 举报
回复
好吧,先结贴,4楼的示例时可行的。
ccbaor 2014-05-23
  • 打赏
  • 举报
回复
引用 4 楼 iyomumx 的回复:
给你一个简单的示范:
Imports System
Imports System.Runtime.InteropServices
Imports System.Text

Module Module1
	<DllImport("msvcrt.dll", CharSet:=CharSet.Unicode, CallingConvention:=CallingConvention.Cdecl, ExactSpelling:=True)>
	Public Function swprintf(ByVal TargetString As System.Text.StringBuilder, ByVal FormatSpecifier As String, ByVal i As Integer, ByVal j As Integer) As Integer
	End Function
    Sub Main()
		Dim Buffer = New StringBuilder(255)
		Dim x = 2014
		swprintf(Buffer, "0x%x 的平方是 0x%x", x, x * x)
		Console.WriteLine(Buffer.ToString())
    End Sub
End Module
十分感谢,按照你提供的示例成功解决了问题,但是还想麻烦您一下,这种直接传递字符串的方式,和引用传递数组首个元素的方式主要区别在哪里?我网上查到的资料是引用传递数组首个元素实际上是传递了他压栈后的地址,是这个原因吗?那引用传递数组首个元素的方法为什么有时候又能成功呢?这问题是不是.net引起的,因为我在c#中也遇到过,麻烦您指点一下,感谢!
iyomumx 2014-05-23
  • 打赏
  • 举报
回复
给你一个简单的示范:
Imports System
Imports System.Runtime.InteropServices
Imports System.Text

Module Module1
	<DllImport("msvcrt.dll", CharSet:=CharSet.Unicode, CallingConvention:=CallingConvention.Cdecl, ExactSpelling:=True)>
	Public Function swprintf(ByVal TargetString As System.Text.StringBuilder, ByVal FormatSpecifier As String, ByVal i As Integer, ByVal j As Integer) As Integer
	End Function
    Sub Main()
		Dim Buffer = New StringBuilder(255)
		Dim x = 2014
		swprintf(Buffer, "0x%x 的平方是 0x%x", x, x * x)
		Console.WriteLine(Buffer.ToString())
    End Sub
End Module
ccbaor 2014-05-23
  • 打赏
  • 举报
回复
引用 2 楼 ccbaor 的回复:
[quote=引用 1 楼 iyomumx 的回复:] 搞出这种引用传递数组第一个元素就能指望P/Invoke帮你把整个数组传过去的,就该砸烂他的狗头,打翻在地,再踏上一只脚,让他永世不得翻身 回到正题,你想传字符串,就在函数定义里写接受字符串参数就好。如果需要确保缓冲区大小,可以换成StringBuilder,并在传递之前用buffer = New StringBuilder(255)这样的构造函数预先分配空间。
你的意思是函数声明里这样写:byref buffer as string 调用的时候是:dim buffer as string=“123” 函数调用的参数是 buffer 是这个样子吗? [/quote] 不对,似乎声明时应该是byval的形式
ccbaor 2014-05-23
  • 打赏
  • 举报
回复
引用 1 楼 iyomumx 的回复:
搞出这种引用传递数组第一个元素就能指望P/Invoke帮你把整个数组传过去的,就该砸烂他的狗头,打翻在地,再踏上一只脚,让他永世不得翻身 回到正题,你想传字符串,就在函数定义里写接受字符串参数就好。如果需要确保缓冲区大小,可以换成StringBuilder,并在传递之前用buffer = New StringBuilder(255)这样的构造函数预先分配空间。
你的意思是函数声明里这样写:byref buffer as string 调用的时候是:dim buffer as string=“123” 函数调用的参数是 buffer 是这个样子吗?
iyomumx 2014-05-22
  • 打赏
  • 举报
回复
搞出这种引用传递数组第一个元素就能指望P/Invoke帮你把整个数组传过去的,就该砸烂他的狗头,打翻在地,再踏上一只脚,让他永世不得翻身 回到正题,你想传字符串,就在函数定义里写接受字符串参数就好。如果需要确保缓冲区大小,可以换成StringBuilder,并在传递之前用buffer = New StringBuilder(255)这样的构造函数预先分配空间。

16,721

社区成员

发帖
与我相关
我的任务
社区描述
VB技术相关讨论,主要为经典vb,即VB6.0
社区管理员
  • VB.NET
  • 水哥阿乐
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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