HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2007
0120
DoubleQuoteさくらさんのstdlibを使ってvbmp3.dllを使いたい2未解決


DoubleQuote

リンク

2007/1/20(Sat) 15:12:59|NO.4925

hsp help centerの方にて質問しようと思ったのですが、なぜか掲示板に書き込めなかった
のであきらめてこちらで質問いたします。どうぞよろしく御願いいたします。

昔、芝やんさんのサイトから"VBMP3.DLL"をhsp2.61で利用するモジュールが
公開されていたのですが、3では使えないようなので
さくらさんのstdlibを使ってこれを使えるようにしようと頑張っている
所存であります。

現在、VBMP3.DLLを使ってmp3ファイルの曲名タグなどを設定する命令を
調整していて困っているのです。memcpyあたりでバッファオーバーフロー
エラーが出てしまいます。これを修正する方法、教えてください。よろしく
御願いいたします。
以下は巨大なモジュール群から関係する部分のみを取り出し、自分が考えた
調整中のスクリプトです。


// "VBMP3.DLL" 関数の定義 #uselib "VBMP3.DLL" #func global vbmp3_init "vbmp3_init" #func global vbmp3_setTagInfo "vbmp3_setTagInfo" int,int,int,int #module #deffunc initmp3 ;******************************************************************************* ; VBMP3.dllイニシャライズ (initmp3) ; ; 戻り値:成功 statは常に0,?? prm1=mm:ss形式に編集した文字列 ; ; 書式 :initmp3 ; Mainvol (int) : 0〜100(50) メインボリューム音量 ; Leftvol (int) : 0〜100(100) 左バランス ; Rightvol (int) : 0〜100(100) 右バランス ; return 0 ; ;-- (NOTE) --------------------------------------------------------------------- ; ; (使用例) ; initmp3 50,100,100 ;******************************************************************************* ;VBMP3構造体用の配列確保 (モジュール内グローバル変数) sdim InputInfo,272 sdim TAG_INFO,652 sdim TAG_INFO_11,656 dim MPEG_INFO,14 dim DEC_OPTION,3 dim VBMP3_OPTION,5 dim WAVE_FORM,4 sdim LIST_INFO,1792 sdim LIST_INFO_EX2,2176 sdim LYRICS_INFO,644 sdim LYRICS_INFO2,1040 ;VBMP3.dll初期化 vbmp3_init : ret=stat if ret==0 { dialog "初期化処理に失敗しました。",0,"エラー" return -1 } return 0 #deffunc settagmp3 var prm1,int prm2,str prm3,int prm4,int prm5 ;******************************************************************************* ; MPEG Audioファイルのタグ情報を設定 (settagmp3) ; ; 戻り値:成功 stat=0, 失敗 stat=-1 ; ; 書式 :settagmp3 ; Value (var) : 文字列型変数 (設定情報) ; nMode (int) : 0〜6(0) 設定する情報番号 ; sFile (str) : MPEG Audioファイル名文字列 or 文字列型変数 ; tagSet (int) : 0〜1(0) タグセット (省略可) ; tagAdd (int) : 0〜1(0) タグ追加 (省略可) ; return 0 ; ;-- (NOTE) --------------------------------------------------------------------- ; ; (使用例) ; s="なんちゃって音楽" ; settagmp3 s,0,"sample.mp3",0,0 ;******************************************************************************* nMode=prm2 : if (nMode<=0)|(nMode>6) : nMode=0 sFile = prm3 : if strlen(sFile)==0 : return -1 tagSet = prm4 : if (tagSet<=0)|(tagSet>1) : tagSet=0 tagAdd = prm5 : if (tagAdd<=0)|(tagAdd>1) : tagAdd=0 ; tagSet = 1 : DLL 内部の TAG 情報書き換え(再生中ファイル時指定) ; 0 : 〃 変更無し ; tagAdd = 1 : ID3Tag v1 が存在しないとき追加する ; 0 : 〃 追加しない vbmp3_setTagInfo varptr(sFile),varptr(TAG_INFO),tagSet,tagAdd ret=stat if ret==1 { if nMode=0 : memcpy TAG_INFO,prm1,128, 0,0 ;曲名 if nMode=1 : memcpy TAG_INFO,prm1,128,128,0 ;アーティスト名 if nMode=2 : memcpy TAG_INFO,prm1,128,256,0 ;アルバム名 if nMode=3 : memcpy TAG_INFO,prm1, 8,384,0 ;リリース年号 if nMode=4 : memcpy TAG_INFO,prm1,128,392,0 ;コメント文字列 if nMode=5 : memcpy TAG_INFO,prm1, 4,520,0 ;ジャンル if nMode=6 : memcpy TAG_INFO,prm1,128,524,0 ;ジャンル名称 } return 0 #global *main // 初期化 initmp3 if ( stat ) : dialog stat : end data = "曲名。" // 曲名データを代入 settagmp3 data,0,"C:\\a.mp3" if ( stat ) : dialog stat : end exec "C:\\a.mp3",,"properties" end



この記事に返信する


YOYO

リンク

2007/1/21(Sun) 08:30:06|NO.4966

stdlibって動作確認とかはしてないのかもしれませんね。
とりあえずsettagmp3の中を以下のようにすれば動作します。
ですがこれですとタグ情報を1個しか設定できず不便ですので適当に修正してください。

nMode=prm2 : if (nMode<=0)|(nMode>6) : nMode=0 sFile = prm3 : if strlen(sFile)==0 : return -1 tagSet = prm4 : if (tagSet<=0)|(tagSet>1) : tagSet=0 tagAdd = prm5 : if (tagAdd<=0)|(tagAdd>1) : tagAdd=0 ; tagSet = 1 : DLL 内部の TAG 情報書き換え(再生中ファイル時指定) ; 0 : 〃 変更無し ; tagAdd = 1 : ID3Tag v1 が存在しないとき追加する ; 0 : 〃 追加しない if vartype(prm1)=2:len=strlen(prm1)+1:else:len=4 memset TAG_INFO,0,652 if nMode=0 : memcpy TAG_INFO,prm1,limit(len,0,128), 0,0 ;曲名 if nMode=1 : memcpy TAG_INFO,prm1,limit(len,0,128),128,0 ;アーティスト名 if nMode=2 : memcpy TAG_INFO,prm1,limit(len,0,128),256,0 ;アルバム名 if nMode=3 : memcpy TAG_INFO,prm1,limit(len,0, 8),384,0 ;リリース年号 if nMode=4 : memcpy TAG_INFO,prm1,limit(len,0,128),392,0 ;コメント文字列 if nMode=5 : memcpy TAG_INFO,prm1,limit(len,0, 4),520,0 ;ジャンル if nMode=6 : memcpy TAG_INFO,prm1,limit(len,0,128),524,0 ;ジャンル名称 vbmp3_setTagInfo varptr(sFile),varptr(TAG_INFO),tagSet,tagAdd if stat=0:return -1 return 0



DoubleQuote

リンク

2007/1/21(Sun) 12:34:34|NO.4973

YOYO様
教えていただき、まことにありがとうございます。
たしかに動作を確認する事ができました。
初めてlimitの使い方、理解できました。色々とありがとうございました

色々と考えてみたのですが、vbmp3.dllはmp3タグの1しか書き込みできないので、不便ですね
今後はmp3infp.dllを使えるように自分で頑張ってみたいと思います。



ONION software Copyright 1997-2021(c) All rights reserved.