0

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

我目前正在将一些 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 函数的方式有关。但我无法追踪它。

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

4

1 回答 1

0

访问冲突通常是由试图写入未指定内存的外部 .DLL 引起的。这是一个 SO 问题,详细介绍了 Access Violations 的常见原因 - .NET 下的访问冲突错误

编组是将数据字段或整组相关结构转换为可在消息中发送的序列化字符串的过程。这是一个 SO 问题,其中包含有关编组的更多信息 什么是编组?当某些东西被“编组”时会发生什么?

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

于 2013-07-14T04:53:14.470 回答