ab.com コミュニティ

ActiveBasicを通したコミュニケーション
現在時刻 - 2018年10月22日(月) 22:47

All times are UTC+09:00




新しいトピックを投稿する  トピックへ返信する  [ 4 件の記事 ] 
作成者 メッセージ
投稿記事Posted: 2010年8月16日(月) 17:27 
ファイルの追加書き込みを行うソフトを作ろうと思い以下のコードを作成しました。
環境 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月17日(火) 12:09 
色々とサンプルを作っているのですが、どうやってもファイルポインタが移動しません。
正確には、移動しても、その場所から書き込み/読み込みができません。

とりあえず、動作さえすればいいので、以下のコードを書いてみました。
コード:
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日(火) 14:25 
あなたは何もわかってない
コード:
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日(火) 17:40 
何も分かっていないため、このコードは大変役に立ちました。
ありがとうございます。

WriteFileの第5パラメータを dim lpOverlapped=NULL As OVERLAPPED
と宣言しておいて使うことができない事が、理解できないので、引数とアドレスに関して
重点的に勉強していきたいと思います。


通報する
ページトップ
   
期間内表示:  ソート  
新しいトピックを投稿する  トピックへ返信する  [ 4 件の記事 ] 

All times are UTC+09:00


オンラインデータ

このフォーラムを閲覧中のユーザー: なし & ゲスト[1人]


トピック投稿:  可
返信投稿:  可
記事編集: 不可
記事削除: 不可
ファイル添付: 不可

検索:
ページ移動:  
cron
Powered by phpBB® Forum Software © phpBB Limited
Japanese translation principally by KONISHI Yohsuke