【问题标题】:ByRef parameter to DLL using Structure - Access Violation使用结构的 DLL 的 ByRef 参数 - 访问冲突
【发布时间】:2013-07-13 13:15:12
【问题描述】:

更新:感谢大家的帮助。我不知道编组我的字符串,这样做之后一切都正常工作。我已经为可能发现此问题的其他人编辑了下面的代码

我目前正在将一些 VB6 代码移植到 .net vb6 应用程序使用的是预编译的 .dll(我相信是用 C++ 制作的),我无法访问它的源代码。

当谷歌搜索函数名时,我只得到一个谷歌结果,它确实有关于它的返回值和它的参数的信息,我相信我已经正确地声明了 .DLL

http://jelleybee.com/fun/vgames/emulate/snes/setup/super%20jukebox/Uematsu.html

.DLL 函数声明

 Declare Function Uematsu_LoadID666Tag Lib "uematsu.dll" (ByVal lpszFileName As String, ByRef lpTag As ID666_tag) As Boolean

我已经这样定义了我的结构

Public Structure ID666_tag
    <MarshalAs(UnmanagedType.ByValTStr, SizeConst:=256)> Public Song As String             'Title of song
    <MarshalAs(UnmanagedType.ByValTStr, SizeConst:=256)> Public Game As String             'Name of game
    <MarshalAs(UnmanagedType.ByValTStr, SizeConst:=256)> Public Artist As String           'Name of artist
    <MarshalAs(UnmanagedType.ByValTStr, SizeConst:=256)> Public Dumper As String           'Name of dumper
    <MarshalAs(UnmanagedType.ByValTStr, SizeConst:=256)> Public Dated As String             'Date dumped
    <MarshalAs(UnmanagedType.ByValTStr, SizeConst:=256)> Public Emu As String              'Emulator used to dump
    <MarshalAs(UnmanagedType.ByValTStr, SizeConst:=256)> Public Comment As String          'Optional comment
    <MarshalAs(UnmanagedType.ByValTStr, SizeConst:=256)> Public OST As String              'Origonal soundtrak title
    Public SongLength As Integer         'Length of song
    Public LoopLength As Integer         'Length of the loop (extended ID666)
    Public EndLength As Integer          'Length of end (extended ID666)
    Public FadeLength As Integer         'length of fade out
    Public OSTDiscNum As Byte         'Origonal sound track disc number
    Public OSTTrack As Short        'Original sound track track number
    Public Publisher As String        'Name Of Publisher
    Public Copyright As Short       'Date of Copyright
    Public Mute As Byte               'Channels to mute
End Structure

我正在使用这样的功能

Function Extract_ID666(Fname As String) As ID666_tag

Dim TempExtr As ID666_tag

If Uematsu_LoadID666Tag(Fname, TempExtr) = True Then
    MessageBox.Show("DONE")
Else
    MessageBox.Show("FAIL")
End If
End Function

但是,当我运行我的 Extract_ID666 函数时,我会收到访问冲突错误。

我知道这与我设置使用 TempExtr 的方式或我声明 .dll 函数的方式有关。但是我查不出来。

对此问题的任何想法或解决方案将不胜感激。 我已经搜索了很长时间试图找到类似的问题但找不到解决方案。

【问题讨论】:

  • 在你的结构声明中看到As Long 是一个危险信号。这适用于 VB6,但不适用于 VB.NET。长 = 整数,整数 = 短。字符串也很可疑,它们通常需要一个属性来声明它们 UnmanagedType.ByValTStr。
  • 不幸的是,这并没有解决我的问题,但我继续将我的长整数更改为整数,将整数更改为短整数。不确定您对字符串的含义,但我感谢您的帮助,并将对其进行更多研究。
  • If Uematsu_LoadID666Tag(Fname, TempExtr) = True Then?为什么不If Uematsu_LoadID666Tag(Fname, TempExtr) Then?无论如何,我认为属性应该是&lt;MarshalAs(UnmanagedType.ByValTStr)&gt;
  • 我不确定如何使用 并且我得到 SizeConst 是固定字符串所必需的。我使用 = true 的原因只是我的可读性和我的一个旧习惯。

标签: vb.net


【解决方案1】:

访问冲突通常是由试图写入未指定内存的外部 .DLL 引起的。这是一个关于访问冲突的详细信息的 SO 问题 Common causes of - Access Violation errors under .NET

编组是将数据字段或整个相关结构集转换为可在消息中发送的序列化字符串的过程。这是一个 SO question,其中包含有关 Marshaling 的更多信息 What is marshalling? What is happening when something is "marshalled?"

这是 MSDN 关于编组字符串的信息 http://msdn.microsoft.com/en-us/library/s9ts558h%28v=vs.71%29.aspx

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-19
    • 1970-01-01
    相关资源
    最近更新 更多