【发布时间】: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?无论如何,我认为属性应该是<MarshalAs(UnmanagedType.ByValTStr)>。 -
我不确定如何使用
并且我得到 SizeConst 是固定字符串所必需的。我使用 = true 的原因只是我的可读性和我的一个旧习惯。
标签: vb.net