ab.com コミュニティ
https://www.activebasic.com/forum/

関数:_splitpathについて
https://www.activebasic.com/forum/viewtopic.php?t=2518
ページ 11

作成者:  C1000 [ 2008年12月27日(土) 21:31 ]
記事の件名:  関数:_splitpathについて

関数:_splitpathを使ってファイル名と取り出すのに次のようなコードを組みましたが、
変数:fname[0]が常にゼロとなってしまい、スタティックテキストに何も表示されませ
ん原因は何でしょうか。
ちなみに、他の変数にはきちんと文字が代入されています。
コード:
dim drv[2]  As Byte
dim path[255] As Byte
dim fname[255] As Byte
dim ext[3] As Byte
'bufferにファイルのパスが入っている
_splitpath(buffer, drv, path, fname, ext)

'スタティックテキストにパスを設定する
SetWindowText(hStatic,lstrcat(fname,ext))
'fname[0]=0となりスタティックテキストに何も表示できない

作成者:  konisi [ 2008年12月27日(土) 22:40 ]
記事の件名: 

こちらの環境では、bufferの中身が
C:/test/test.abp.txt
となってるときには上手く動きませんでしたが、
C:\test\test.abp.txt
となってるときには上手く動きました。

bufferの中身はどのようになっていますか?

作成者:  C1000 [ 2008年12月27日(土) 23:08 ]
記事の件名: 

bufferの中身は「ファイルを開く」ダイアログボックスで取得しているのでいろいろ変わりますが、
C:\test\test.abp.txt
などという形式です。
また、
_splitpath("C:/test/test.abp.txt", drv, path, fname, ext)
のように直接パスを入れてみてもうまくいきませんでした。
また、普通の.abのファイルに下のようなコードで試したところ、こちらではうまくいきました。しかし、プロジェクトファイルではうまくいきませんでした。
コード:
dim drv[2]  As Byte
dim path[255] As Byte
dim fname[255] As Byte
dim ext[63] As Byte
dim f[255] As Byte
Dim ofn As OPENFILENAME
Dim buffer[MAX_PATH-1] As Byte
'------------------
' ファイル名を取得
'------------------
ofn.lStructSize=Len(ofn)
ofn.hwndOwner=0
ofn.lpstrFilter=Ex"マルチメディア ファイル (*.avi;*.wav;*.mid;*.mp3;*.wma)\0*.avi;*.wav;*.mid;*.mp3;*.wma\0すべてのファイル(*.*)\0*\0\0"
ofn.nFilterIndex=1
ofn.nMaxFile=MAX_PATH
ofn.Flags=OFN_FILEMUSTEXIST or OFN_HIDEREADONLY
ofn.lpstrFile=f

GetOpenFileName(ofn)

_splitpath(ofn.lpstrFile, drv, path, fname, ext)
MessageBox(0, lstrcat(fname,ext), "testcode", MB_OK)
end

作成者:  konisi [ 2008年12月29日(月) 16:41 ]
記事の件名: 

>また、普通の.abのファイルに下のようなコードで試したところ
AB5のどのバージョンを使っていますか?
「UNICODE文字セットを使用する」のチェックが入っている場合は、_splitpath関数の代わりに_wsplitpath関数を用いる事で解決するかもしれません。
コード:
Declare Sub _wsplitpath Lib "MSVCRT" (path As *Word,drive As *Word,dir As *Word,name As *Word,ext As *Word)

作成者:  C1000 [ 2008年12月31日(水) 20:38 ]
記事の件名: 

バージョンはAB5β13です。「UNICODE文字セットを使用する」のチェックは入っていませんでした。_wsplitpath関数を使って試してみましたがうまくいきませんでした。

作成者:  ゲスト [ 2009年1月03日(土) 08:09 ]
記事の件名: 

ver424で下記のようにして使ってます。
以前に凡そで造ったので、何か変な気がしていますが動いてます。

function filesplit(tes as string,k as word) as string
dim drv as BytePtr ,dir as BytePtr ,fna as BytePtr ,ext as BytePtr
dim ppath as BytePtr
drv=malloc(8)
dir=malloc(255)
fna=malloc(128)
ext=malloc(8)
ppath=calloc(512)
_splitpath(tes,drv,dir,fna,ext)
select case k
case 1
lstrcat(ppath,drv)'
lstrcat(ppath,dir)'
case 2
lstrcat(ppath,fna)'
lstrcat(ppath,ext)'
end select
ppath[lstrlen(ppath)]=0
filesplit=MakeStr(ppath)
end function

作成者:  konisi [ 2009年1月03日(土) 15:05 ]
記事の件名: 

なぜβ13使ってるんだろう。
せめてAB4.24とかAB5CP5とか使ってみてください。

>>ゲスト
見間違いでなければ、物凄い勢いでメモリリークしない?その関数。

作成者:  C1000 [ 2009年1月03日(土) 16:21 ]
記事の件名: 

Konisiさんのコードでうまくファイル名を分離できました。ゲストさん、konisiさんありがとうございました。ちなみに、β13を使う理由はAB5のほうがきのうがいいけれどABCP5だとものすごい数のエラーが出るから、ということです。

ページ 11 全ての表示時間は UTC+09:00 です
Powered by phpBB® Forum Software © phpBB Limited
https://www.phpbb.com/