搜索
查看: 1362|回复: 5

调用BASS.dll时出错

[复制链接]

5

主题

19

帖子

113

积分

一级会员

Rank: 2

积分
113
发表于 2017-10-4 21:36:24 | 显示全部楼层 |阅读模式
系统是win10
想使用bass库 播放音乐 初始化都没问题 加载文件的时候就出错了
不知道是我哪里用的不对,请指点

测试代码:
  1. import console
  2. console.setTitle("播放音乐")
  3. api = ..raw.loadDll("~\lib\bass\.res\bass.dll");
  4. var ver = api.BASS_GetVersion();
  5. console.log("版本:", string.format("%X", ver) )
  6. if(api.BASS_Init(-1,44100,0,0,0)){
  7.         console.log("初始化成功!")
  8. }else {
  9.         console.log("初始化失败:", api.BASS_ErrorGetCode())
  10. }

  11. var handle = api.BASS_StreamCreateFile(false,"\res\test.mp3",0,0,0)
  12. if(handle){
  13.         api.BASS_ChannelPlay(handle, 0)
  14. }
  15. console.pause(true)
复制代码


错误图片
回复

使用道具 举报

185

主题

2541

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
13974
发表于 2017-10-4 22:57:57 | 显示全部楼层
类似这种问题,最好附上该API函数的原型和文档,以及C或C++的调用示例。

加载DLL请注意指定正确的调用约定,
调用API需要指定正确的参数,如果发生错误DLL没有提供错误信息而是崩溃,仔细核对厂商提供的API文档,如果有DLL的源码使用C++开发工具绑定进程进行调试查找错误原因。

"\rest\test3.mp3" 这种写法只有aardio函数才能认出来,
API函数没有这么聪明,你应当使用 io.fullpath("\rest\test3.mp3" ) 得到完整路径。

另外弄清楚你的DLL使用的是Unicode还是ANSI编码。
如果是Unicode在调用约定中指定,或者在函数名后加W(看帮助文档)。
如果是ANSI,用 string.fromto()函数转换。注意aardio字符串默认是UTF8编码。

回复

使用道具 举报

5

主题

19

帖子

113

积分

一级会员

Rank: 2

积分
113
 楼主| 发表于 2017-10-5 08:48:28 | 显示全部楼层
Jacen.He 发表于 2017-10-4 22:57
类似这种问题,最好附上该API函数的原型和文档,以及C或C++的调用示例。

加载DLL请注意指定正确的调用约 ...


文档在这里

dll是ANSI的 用
  1. string.fromto()
复制代码
转换一下
另外声明一下函数 就可以了
回复

使用道具 举报

5

主题

19

帖子

113

积分

一级会员

Rank: 2

积分
113
 楼主| 发表于 2017-10-5 13:05:15 | 显示全部楼层

图的链接插错了 ...
回复

使用道具 举报

185

主题

2541

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
13974
发表于 2017-10-5 13:40:44 | 显示全部楼层
调用API时数如果参数的位长度错了,那会直接导致程序异常退出。

不声明直接调用API时,数值默认为32位int,
如果参数是64位整数值,可以用2个32位参数表示,例如:

var path = string.fromto( io.fullpath("\res\test.mp3"));
var handle = api.BASS_StreamCreateFile(false,path,0,0,0,0,0)

或者用 math.size64 来表示64位整数
var handle = api.BASS_StreamCreateFile(false,path,math.size64(0),math.size64(0),0)

回复

使用道具 举报

5

主题

19

帖子

113

积分

一级会员

Rank: 2

积分
113
 楼主| 发表于 2017-10-5 15:07:23 | 显示全部楼层
Jacen.He 发表于 2017-10-5 13:40
调用API时数如果参数的位长度错了,那会直接导致程序异常退出。

不声明直接调用API时,数值默认为32位in ...

非常感谢 !
认真的去看了下帮助文档:
    9.3、直接调用API时,如果目标API函数并不存在,而是存在加"W"后缀的Unicode API,aardio将会自动切换到Unicode API,并在调用函数时,自动将aardio的UTF8编码转换为API所需要的UTF16编码。

而函数原型最后一个参数 flags :
BASS_UNICODE        file is in UTF-16 form. Otherwise it is ANSI on Windows or Windows CE, and UTF-8 on other platforms.
这样可以不用 string.fromto() 做编码转换,直接像下面这样调用:  
var path = io.fullpath("\res\test.mp3");
var handle = dll.BASS_StreamCreateFileW(false, path, 0,0, 0,0, 0x80000000/*_BASS_UNICODE*/)



回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

手机版|未经许可严禁引用或转载本站文章|站长邮箱|aardio.com|aardio官方社区 ( 皖ICP备09012014号 )

GMT+8, 2018-12-15 15:38 , Processed in 0.062500 second(s), 22 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表