作成者 |
メッセージ |
|
|
何も分かっていないため、このコードは大変役に立ちました。
ありがとうございます。
WriteFileの第5パラメータを dim lpOverlapped=NULL As OVERLAPPED
と宣言しておいて使うことができない事が、理解できないので、引数とアドレスに関して
重点的に勉強していきたいと思います。
何も分かっていないため、このコードは大変役に立ちました。 ありがとうございます。
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]
あなたは何もわかってない [code] 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 [/code][/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は動かない、いや動くけど
その後の読み書きがうまくいかないんだろう。
根本的な解決策ご存じの方いませんか?
色々とサンプルを作っているのですが、どうやってもファイルポインタが移動しません。 正確には、移動しても、その場所から書き込み/読み込みができません。
とりあえず、動作さえすればいいので、以下のコードを書いてみました。 [code] 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 [/code]
同じようなことで困っている方のために、とりあえずの救済策です。 でも、何で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の宣言の仕方でしょうか?
ご教授いただければ幸いです。
ファイルの追加書き込みを行うソフトを作ろうと思い以下のコードを作成しました。 環境 XPSP3、AB4.24.0
[code] 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 [/code]
ファイルをオープンし、ポインタを最後に動かし、書き込んでいるだけなのですが、 思ったように追加書き込みされず、常に新規書き込み(ファイルサイズは増えない) 状況です。 問題点は、SetFilePointerでポインタは移動するのですが、 その後WriteFileで書き込んでも、ポインタが移動しない(ポインタ0から書き込み) 事のようです。 根本的に、SetFilePointerの使い方(理解)が間違っているのでしょうか? それとも、CreateFileの宣言の仕方でしょうか?
ご教授いただければ幸いです。
|
|
|
投稿記事 |
Posted: 2010年8月16日(月) 17:27 |
|
|
|
|