ab.com コミュニティ

ActiveBasicを通したコミュニケーション
現在時刻 - 2024年3月29日(金) 06:01

全ての表示時間は UTC+09:00 です




返信する
ユーザー名:
件名:
メッセージ本文:
メッセージを入力してください。60000 字まで入力できます。 

フォントサイズ:
フォントカラー
オプション:
BBCode: ON
[img]: ON
[flash]: OFF
[url]: ON
スマイリー: OFF
BBCode を無効にする
URL を自動的にパースしない
クイズ
お手数ですがカタカナで「エービー」と4文字を入力してください。:
答えを正確に入力してください。答えられるかどうかでスパムボットか否かを判定します。
   

トピックのレビュー - ファイルの追加書き込み(SetFilePointerの動作)
作成者 メッセージ
  記事の件名:  無事に動きました  引用付きで返信する
何も分かっていないため、このコードは大変役に立ちました。
ありがとうございます。

WriteFileの第5パラメータを dim lpOverlapped=NULL As OVERLAPPED
と宣言しておいて使うことができない事が、理解できないので、引数とアドレスに関して
重点的に勉強していきたいと思います。
投稿記事 Posted: 2010年8月17日(火) 17:40
  記事の件名:  何もわかってない  引用付きで返信する
あなたは何もわかってない
コード:
Dim hFile As HANDLE
Dim buf[30] as Byte
Dim fname[30] as Byte
Dim gfs1 as DWord        '書き込みサイズ(予定)
Dim gfs2 as DWord        '書き込みサイズ(結果)
Dim i as DWord         'ファイルポインタの結果 <--- DWord型
Dim wans as DWord        '書き込み結果 <--- DWord型
Dim over As OVERLAPPED

if lstrcpy(buf,"abcdefghijklmnopqrstuvwxyz") = NULL then
    MsgBox NULL, buf, "文字列コピーミス", MB_ICONEXCLAMATION  
End If

gfs1=lstrlen(buf)
lstrcpy(fname,"read_log.txt")

' <--- GENERIC_WRITE or GENERIC_WRITEでは意味が無いので修正。
hFile=CreateFile( fname, GENERIC_WRITE,   0  ,ByVal 0, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0)
if hFile <> INVALID_HANDLE_VALUE then
    i=SetFilePointer( hFile, 0, NULL, FILE_END)        'ファイルポインタをファイルの最後に移動
    if i <> -1 then                                    '移動できたら

		' <--- OVERLAPPED構造体を使うときは”必ず”オフセットを入れる
/*
		over.Offset = i
        wans=WriteFile(hFile,buf,gfs1,VarPtr(gfs2), over)
*/
		wans=WriteFile(hFile,buf,gfs1,VarPtr(gfs2), ByVal 0) ' <---同期書込みの場合は必要なし
		
        if wans=TRUE then
            if(CloseHandle(hFile) = TRUE) then
                MsgBox NULL, "無事終了", "Error", MB_ICONEXCLAMATION  
            Else
                MsgBox NULL, "ファイルのクローズミス", "Error", MB_ICONEXCLAMATION  
            End If
        Else
            MsgBox NULL, "ファイルのオープンミス", "Error", MB_ICONEXCLAMATION  
        End If
    Else
        MsgBox NULL, "ファイルポインタの移動エラー", "Error", MB_ICONEXCLAMATION  
        
    End If
Else
    MsgBox NULL, "ファイルが開けません", "Error", MB_ICONEXCLAMATION  
End If
[/url]
投稿記事 Posted: 2010年8月17日(火) 14:25
  記事の件名:  動作さえすれば  引用付きで返信する
色々とサンプルを作っているのですが、どうやってもファイルポインタが移動しません。
正確には、移動しても、その場所から書き込み/読み込みができません。

とりあえず、動作さえすればいいので、以下のコードを書いてみました。
コード:
dim hFile As HANDLE
dim  lpOverlapped=NULL As OVERLAPPED
dim buf[30] as Byte
dim fname[30] as Byte
dim gfs1 as DWORD		'書き込みサイズ(予定)
dim gfs2 as DWORD		'書き込みサイズ(結果)
dim i as integer 		'ファイルポインタの結果
dim wans as integer		'書き込み結果
dim buf1[200] as Byte
dim buf2[200] as Byte

if lstrcpy(buf,"abcdefghijklmnopqrstuvwxyz") = NULL then
	MsgBox NULL, buf, "文字列コピーミス", MB_ICONEXCLAMATION  
End If

gfs1=lstrlen(buf)
lstrcpy(fname,"read_log.txt")
lstrcpy(buf1,"cmd")
lstrcpy(buf2, "/c echo ")
lstrcat(buf2,buf)
lstrcat(buf2,">> ")
lstrcat(buf2,fname)

hFile=CreateFile(fname, GENERIC_WRITE or GENERIC_WRITE,   FILE_SHARE_READ  ,ByVal 0, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0)
if hFile <> INVALID_HANDLE_VALUE then

	ShellExecute(NULL, NULL, buf1,buf2, NULL, SW_SHOWMINNOACTIVE)
	if(CloseHandle(hFile) = TRUE) then
		MsgBox NULL, "無事終了", "Error", MB_ICONEXCLAMATION  
	Else
		MsgBox NULL, "ファイルのクローズミス", "Error", MB_ICONEXCLAMATION  
	End If
Else
	MsgBox NULL, "ファイルが開けません", "Error", MB_ICONEXCLAMATION  
End If
同じようなことで困っている方のために、とりあえずの救済策です。
でも、何でSetFilePointerは動かない、いや動くけど
その後の読み書きがうまくいかないんだろう。
根本的な解決策ご存じの方いませんか?
投稿記事 Posted: 2010年8月17日(火) 12:09
  記事の件名:  ファイルの追加書き込み(SetFilePointerの動作)  引用付きで返信する
ファイルの追加書き込みを行うソフトを作ろうと思い以下のコードを作成しました。
環境 XPSP3、AB4.24.0
コード:
dim hFile As HANDLE
dim  lpOverlapped=NULL As OVERLAPPED
dim buf[30] as Byte
dim fname[30] as Byte
dim gfs1 as DWORD		'書き込みサイズ(予定)
dim gfs2 as DWORD		'書き込みサイズ(結果)
dim i as integer 		'ファイルポインタの結果
dim wans as integer		'書き込み結果

if lstrcpy(buf,"abcdefghijklmnopqrstuvwxyz") = NULL then
	MsgBox NULL, buf, "文字列コピーミス", MB_ICONEXCLAMATION  
End If

gfs1=lstrlen(buf)
lstrcpy(fname,"read_log.txt")
 
hFile=CreateFile(fname, GENERIC_WRITE or GENERIC_WRITE,   FILE_SHARE_READ  ,ByVal 0, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0)
if hFile <> INVALID_HANDLE_VALUE then
	i=SetFilePointer(hFile, 0, NULL, FILE_END)		'ファイルポインタをファイルの最後に移動
	if i <> -1 then									'移動できたら
		wans=WriteFile(hFile,buf,gfs1,VarPtr(gfs2),lpOverlapped)
		if wans=TRUE then
			if(CloseHandle(hFile) = TRUE) then
				MsgBox NULL, "無事終了", "Error", MB_ICONEXCLAMATION  
			Else
				MsgBox NULL, "ファイルのクローズミス", "Error", MB_ICONEXCLAMATION  
			End If
		Else
			MsgBox NULL, "ファイルのオープンミス", "Error", MB_ICONEXCLAMATION  
		End If
	Else
		MsgBox NULL, "ファイルポインタの移動エラー", "Error", MB_ICONEXCLAMATION  
		
	End If
Else
	MsgBox NULL, "ファイルが開けません", "Error", MB_ICONEXCLAMATION  
End If
ファイルをオープンし、ポインタを最後に動かし、書き込んでいるだけなのですが、
思ったように追加書き込みされず、常に新規書き込み(ファイルサイズは増えない)
状況です。
問題点は、SetFilePointerでポインタは移動するのですが、
その後WriteFileで書き込んでも、ポインタが移動しない(ポインタ0から書き込み)
事のようです。
根本的に、SetFilePointerの使い方(理解)が間違っているのでしょうか?
それとも、CreateFileの宣言の仕方でしょうか?

ご教授いただければ幸いです。
投稿記事 Posted: 2010年8月16日(月) 17:27

全ての表示時間は UTC+09:00 です


ページ移動:  
cron
Powered by phpBB® Forum Software © phpBB Limited
Japanese translation principally by ocean