有个音频接口 BASS.DLL 的API函数,VB6 的原型是这样的:
Public Declare Function BASS_StreamCreateFile64 Lib "bass.dll" Alias "BASS_StreamCreateFile" (ByVal mem As Long, ByVal file As Any, ByVal offset As Long, ByVal offsethigh As Long, ByVal length As Long, ByVal lengthhigh As Long, ByVal flags As Long) As Long
其中这个 “ANY” 类型在 .NET 中不再受支持,加上 <System.Runtime.InteropServices.MarshalAs(System.Runtime.InteropServices.UnmanagedType.AsAny)> 修饰符倒是可以声明,但是传递参数的时候又遇到问题了:VB6中传递这个文件名参数要使用 STRPTR 转换成地址才能传递,但是.NET又不支持 STRPTR,使用下述语句传递地址,结果 DLL 函数并没有正确响应,返回0表示失败。
Dim GC As System.Runtime.InteropServices.GCHandle = System.Runtime.InteropServices.GCHandle.Alloc(str, Runtime.InteropServices.GCHandleType.Pinned)
Dim RET As IntPtr = GC.AddrOfPinnedObject
GC.Free()
这个真不会了,刚从 VB6 进入.NET,感觉还有很多东西要学,请各位大神指点一二,有写过 BASS.DLL 音频接口的大神在吗??虽然可以使用 BASS.NET.DLL 来代替,但是那个接口有注册窗口,挺无语的。
Public Declare Function BASS_StreamCreateFile64 Lib "bass.dll" Alias "BASS_StreamCreateFile" (ByVal mem As Long, ByVal file As Any, ByVal offset As Long, ByVal offsethigh As Long, ByVal length As Long, ByVal lengthhigh As Long, ByVal flags As Long) As Long
其中这个 “ANY” 类型在 .NET 中不再受支持,加上 <System.Runtime.InteropServices.MarshalAs(System.Runtime.InteropServices.UnmanagedType.AsAny)> 修饰符倒是可以声明,但是传递参数的时候又遇到问题了:VB6中传递这个文件名参数要使用 STRPTR 转换成地址才能传递,但是.NET又不支持 STRPTR,使用下述语句传递地址,结果 DLL 函数并没有正确响应,返回0表示失败。
Dim GC As System.Runtime.InteropServices.GCHandle = System.Runtime.InteropServices.GCHandle.Alloc(str, Runtime.InteropServices.GCHandleType.Pinned)
Dim RET As IntPtr = GC.AddrOfPinnedObject
GC.Free()
这个真不会了,刚从 VB6 进入.NET,感觉还有很多东西要学,请各位大神指点一二,有写过 BASS.DLL 音频接口的大神在吗??虽然可以使用 BASS.NET.DLL 来代替,但是那个接口有注册窗口,挺无语的。