关于调用dll传址和传值的问题

楚狂歌 2015-08-10 01:33:49
问题是这样的:

我有一个标准dll
Declare Function GetDeviceInfo Lib "mmDll" (ByRef ud As Dev, ByVal devCount As Integer, ByVal DevStr As String, ByVal pdTag As String, addr As Byte, numdevs As Integer) As Integer
(Dev是个结构体)

通过这个dll返回设备信息
问题来了:DevStr和 pdTag是作为参数来接收返回值的,用byval时可以正常获取返回值,
使用byref则会直接导致程序卡死,为什么?通常情况下不是用byref才能返回值的吗?
有遇到过这个问题的么?求解释下。
...全文
753 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
Tiger_Zhao 2015-08-12
  • 打赏
  • 举报
回复
定长字符串还是老老实实用字节数组。
楚狂歌 2015-08-12
  • 打赏
  • 举报
回复
特别是第二个参数,VB6声明为ByVal devCount As Integer,但是在VB.NET中必须为Byref,否则调试自动退出。。。 不过VB6调用声明的DevStr、pdTag字符串是定长的,这个有影响没
楚狂歌 2015-08-12
  • 打赏
  • 举报
回复
引用 4 楼 Tiger_Zhao 的回复:
[Quote=引用 2 楼 u011266608 的回复:]问题是这种代码无法转换为VB.NET,无论怎么尝试都不行。。。[/Quote]
    <DllImport("mmDll.DLL", _
               EntryPoint:="GetDeviceInfo", _
               SetLastError:=True, _
               CharSet:=CharSet.Ansi, _
               ExactSpelling:=True, _
               CallingConvention:=CallingConvention.StdCall)> _
    Public Shared Function GetDeviceInfo(ByRef ud As Dev, _
                                         ByVal devCount As Short, _
                                         ByRef DevStr As String, _
                                         ByRef pdTag As String, _
                                         ByVal addr As Byte, _
                                         ByVal numdevs As Short) As Short
也报同样的错误 “System.AccessViolationException”类型的未经处理的异常在 FieldBusCommunication.exe 中发生 其他信息: 尝试读取或写入受保护的内存。这通常指示其他内存已损坏。
Tiger_Zhao 2015-08-10
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 u011266608 的回复:]问题是这种代码无法转换为VB.NET,无论怎么尝试都不行。。。[/Quote]
    <DllImport("mmDll.DLL", _
EntryPoint:="GetDeviceInfo", _
SetLastError:=True, _
CharSet:=CharSet.Ansi, _
ExactSpelling:=True, _
CallingConvention:=CallingConvention.StdCall)> _
Public Shared Function GetDeviceInfo(ByRef ud As Dev, _
ByVal devCount As Short, _
ByRef DevStr As String, _
ByRef pdTag As String, _
ByVal addr As Byte, _
ByVal numdevs As Short) As Short
wy24789 2015-08-10
  • 打赏
  • 举报
回复
vb.net也可以的,你可以贴.net的代码,或者到.net的板块问
楚狂歌 2015-08-10
  • 打赏
  • 举报
回复
引用 1 楼 Tiger_Zhao 的回复:
这是特殊情况。 VB6内部字符串是Unicode的,但是当时操作系统Win9X还是Ansi字符串,所以VB是按Ansi格式来调用API的。 对于字符串参数,VB会自动进行Unicode->Ansi的转换,调用API,对返回值再进行Ansi->Unicode转换。 和API交互的并不是真正的参数DevStr和pdTag,而是两个转换编码的中间变量。 反正规定这种情况是用ByVal的,没什么好多说的。
问题是这种代码无法转换为VB.NET,无论怎么尝试都不行。。。
Tiger_Zhao 2015-08-10
  • 打赏
  • 举报
回复
这是特殊情况。
VB6内部字符串是Unicode的,但是当时操作系统Win9X还是Ansi字符串,所以VB是按Ansi格式来调用API的。
对于字符串参数,VB会自动进行Unicode->Ansi的转换,调用API,对返回值再进行Ansi->Unicode转换。
和API交互的并不是真正的参数DevStr和pdTag,而是两个转换编码的中间变量。
反正规定这种情况是用ByVal的,没什么好多说的。

863

社区成员

发帖
与我相关
我的任务
社区描述
VB COM/DCOM/COM+
c++ 技术论坛(原bbs)
社区管理员
  • COM/DCOM/COM+社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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