関数:_splitpathについて

ActiveBasicでのプログラミングでわからないこと、困ったことなどがあったら、ここで質問してみましょう(質問を行う場合は、過去ログやWeb上であらかじめ問題を整理するようにしましょう☆)。
返信する
メッセージ
作成者
C1000
記事: 185
登録日時: 2006年5月07日(日) 17:16
お住まい: 宮城県
連絡する:

関数:_splitpathについて

#1 投稿記事 by C1000 »

関数:_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
記事: 893
登録日時: 2005年7月25日(月) 13:27
お住まい: 埼玉県東松山市
連絡する:

#2 投稿記事 by konisi »

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

bufferの中身はどのようになっていますか?
Website→http://web1.nazca.co.jp/himajinn13sei/top.html
ここ以外の場所では「暇人13世」というHNを主として使用。

に署名を書き換えて欲しいと言われたので暇だしやってみるテスト。
C1000
記事: 185
登録日時: 2006年5月07日(日) 17:16
お住まい: 宮城県
連絡する:

#3 投稿記事 by C1000 »

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
記事: 893
登録日時: 2005年7月25日(月) 13:27
お住まい: 埼玉県東松山市
連絡する:

#4 投稿記事 by konisi »

>また、普通の.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)
Website→http://web1.nazca.co.jp/himajinn13sei/top.html
ここ以外の場所では「暇人13世」というHNを主として使用。

に署名を書き換えて欲しいと言われたので暇だしやってみるテスト。
C1000
記事: 185
登録日時: 2006年5月07日(日) 17:16
お住まい: 宮城県
連絡する:

#5 投稿記事 by C1000 »

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

#6 投稿記事 by ゲスト »

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
記事: 893
登録日時: 2005年7月25日(月) 13:27
お住まい: 埼玉県東松山市
連絡する:

#7 投稿記事 by konisi »

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

>>ゲスト
見間違いでなければ、物凄い勢いでメモリリークしない?その関数。
Website→http://web1.nazca.co.jp/himajinn13sei/top.html
ここ以外の場所では「暇人13世」というHNを主として使用。

に署名を書き換えて欲しいと言われたので暇だしやってみるテスト。
C1000
記事: 185
登録日時: 2006年5月07日(日) 17:16
お住まい: 宮城県
連絡する:

#8 投稿記事 by C1000 »

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