使用结构 - 访问冲突的DLL的ByRef参数

时间:2013-07-13 13:15:13

标签: vb.net

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

我目前正致力于将一些VB6代码移植到.net vb6应用程序正在使用预编译的.dll(用C ++制作,我相信),我没有任何访问其源代码的权限。

在Google搜索功能名称时,我只获得一个google结果,其中包含有关其返回值及其参数的信息,我相信我已正确声明.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函数有关。但是我无法追踪它。

非常感谢任何有关此问题的想法或解决方案。 我已经搜索了很长时间,试图找到类似的问题,但找不到解决方案。

1 个答案:

答案 0 :(得分:0)

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

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

以下是有关Marshaling Strings的MSDN信息 http://msdn.microsoft.com/en-us/library/s9ts558h%28v=vs.71%29.aspx