APIを学習中の初心者です。
サンプルコードにあったのですが、test0623.txt のテキストを作成し、「abcde」と書き込むというものです。
Const GENERIC_WRITE = &H40000000
Const GENERIC_READ = &H80000000
Const FILE_ATTRIBUTE_NORMAL = &H80
Const CREATE_ALWAYS = 2
Const OPEN_ALWAYS = 4
Const INVALID_HANDLE_VALUE = -1
Private Declare Function CloseHandle Lib "kernel32" ( _
ByVal hObject As Long) As Long
Private Declare Function WriteFile Lib "kernel32" ( _
ByVal hFile As Long, lpBuffer As Any, _
ByVal nNumberOfBytesToWrite As Long, _
lpNumberOfBytesWritten As Long, ByVal lpOverlapped As Long) As Long
Private Declare Function CreateFile Lib "kernel32" _
Alias "CreateFileA" (ByVal lpFileName As String, _
ByVal dwDesiredAccess As Long, ByVal dwShareMode As Long, _
ByVal lpSecurityAttributes As Long, _
ByVal dwCreationDisposition As Long, _
ByVal dwFlagsAndAttributes As Long, ByVal hTemplateFile As Long) As Long
Sub test1()
Dim hFile As Long
Dim FileName As String
Dim Sampledata() As Byte
Dim BytesToWritten As Long
Dim SC As Long
FileName = "test0623.txt"
SC = StrConv("abcde", vbFromUnicode)
hFile = CreateFile(FileName, GENERIC_WRITE Or GENERIC_READ, _
0, 0, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0)
SC = WriteFile(hFile, Sampledata(0), _
UBound(Sampledata), BytesToWritten, 0)
Call CloseHandle(hFile)
End Sub
とあったのですが質問は以下の通りです。
(1) SC = WriteFile(hFile, Sampledata(0), UBound(Sampledata), BytesWritten, 0) で、な ぜ、lpBuffer(第1引数)にSampledata(0)を指定すれば、ファイルに書き込むべきデータを保持しているバッファへのポインタになるのか?またSampledata(0)のように配列にする理由が不明?
(2) SC = WriteFile(hFile, Sampledata(0), UBound(Sampledata), BytesWritten, 0) で、なぜ、 nNumberOfBytesToWrite(第2引数)に UBound(Sampledata)を指定すれば、ファイルに書き込むべきバイト数になるのか?ここで、0を指定すると、何も書き込まないらしい。
(3) SC = WriteFile(hFile, Sampledata(0), UBound(Sampledata), BytesWritten, 0) で、なぜ、lpNumberOfBytesWritten(第3引数)に何の値も格納していない BytesWritten を記述しているのか?MSDNライブラリには、「関数から制御が返ると、この変数に、実際に書き込まれたバイト数が格納されます。」とあるので、指定しなくてよいのか?
(4) Pathを指定していないが、なぜか、C:\Users\123\Documents に作成される。
以上です。よろしくお願いします
No.1ベストアンサー
- 回答日時:
SC = StrConv("abcde", vbFromUnicode)
は
Sampledata = StrConv("abcde", vbFromUnicode)
の間違いかな? その前提で、
(1)それはVisual BasicとWin32APIの相互運用でそういう事になってるとしか・・・・。Win32APIは元々C言語用のAPIなので、VBから呼び出す時はケースバイケースで妙なお作法があったりするのです。
(2)それはSampledataがByteの配列だからだ。UBoundは配列の最大要素番号を返すものだが、StrConvが返したバイト数を指定する場面ではByteの配列の要素数がそのままバイト数になる。ただ・・・・StrConv("abcde", vbFromUnicode)をByteの配列に代入してUBoundを取ると1少なくなるんじゃないかなぁ。UBound(Sampledata)は4になるんじゃなかろうか。
(3)この第三引数は、入力じゃなくて出力だ。つまり、あなたが値を設定してWriteFileに渡すのではなく、WriteFile内で値を設定してあなたに返してくれるものだ。だからあなたは何の値も格納しなくてよい。Declareを見ると、そこだけByValが無い事に気づくだろう。それが、VBで言うところのByRef、呼び元と呼び先で変数を共有する仕組みだ。
(4)それは「カレントディレクトリ」と呼ばれる仕組みによって実現されている。カレントディレクトリとは、「ディレクトリを指定せずにファイルを読み書きしたらそのディレクトリが補完される」ディレクトリの事で、VB6やVBAではChDirステートメントで変更する事ができる。
回答ありがとうございます。
Byteの配列を初めて見たのですが、回答のおかげで理解できました。UBound値も4になっていました。
(1)や(4)のようにお約束になっていることがかなりあるのですね。
わかりやすい解説で理解できました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Access(アクセス) Vba Userformを前面に出すについて 3 2022/04/15 12:29
- Excel(エクセル) 【マクロ】スクショ印刷がうまく動かない件 5 2022/12/06 17:37
- Visual Basic(VBA) いつもお世話になっております、VBAで教えて頂きたいのですが 2 2022/05/05 22:20
- Visual Basic(VBA) 別シートから年齢別の件数をカウントしたいの続き 5 2023/01/24 00:16
- Excel(エクセル) Excelにて、フォルダ内のTextファイルをマクロで統合すると文字化けしてしまう時の解消コード 4 2023/01/01 07:32
- Visual Basic(VBA) VBAで質問ですが、皆さんはどの様に導き出しているのでしょうか? 6 2022/05/03 21:53
- Excel(エクセル) VBAの指示の内容 昨日こちらでご教示頂いたのですが初心者な為、一つ一つの指示が何をやっているのかわ 2 2022/10/25 18:08
- Visual Basic(VBA) VBA 別ブックからの転記の高速化について VBA 別ブックからの転記の高速化についてご教授下さい。 19 2022/07/26 13:07
- Excel(エクセル) excel vba 参照渡しと値渡し 2 2022/04/27 10:45
- Visual Basic(VBA) Vbaで数式をポーランド記法に変換するコードを作って実行しようとするとフリーズします。 1 2022/05/24 17:53
このQ&Aを見た人はこんなQ&Aも見ています
-
「どうして捨てられないの?」前妻の物を捨てられない男性の心理って?
前妻の物を捨てられない理由に加え、捨てるための手段はあるのかを専門家に聞いてみた!
-
エクセル VBA でのCOMポート認識
その他(プログラミング・Web制作)
-
WriteFile()でのデータ送信ができなくなる
C言語・C++・C#
-
シリアル通信時のデータ受信方法
Visual Basic(VBA)
-
-
4
_T(abcdef") の_Tってなんですか?"
C言語・C++・C#
-
5
DWORDの実際の型は何でしょうか
C言語・C++・C#
-
6
VBAを使用して、USBでつないだ機器の制御が出来るでしょうか?
Access(アクセス)
-
7
ReadFileの読み込みエラーについて
C言語・C++・C#
-
8
WriteFile関数
C言語・C++・C#
-
9
バイト型のデータをLong型に変換
Visual Basic(VBA)
-
10
VBA2005 16進を2桁で表示したい。
Visual Basic(VBA)
-
11
HANDLEの宣言でのエラー
C言語・C++・C#
-
12
C++言語で、構造体のコピーは可能(しても良い)のでしょうか?
C言語・C++・C#
-
13
[C++]WCHARの1文字目しか表示できない
C言語・C++・C#
-
14
VC++ 2008 EXPRESS _T"識別子がみつかりません"
C言語・C++・C#
-
15
EXCEL VBAで、PnPでCOMポート番号取得
Visual Basic(VBA)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
make時に出てきたエラーメッセ...
-
拡張子.dどういう意味
-
/(スラッシュ)で区切ったフル...
-
7zを使うとフォルダの中身がす...
-
ファイル名で / (スラッシュ...
-
linuxコマンド mkdirでディレ...
-
特定文字列を除外してcpする方法
-
ftpのmgetコマンドの自分の格納...
-
「ドット(.)」と「¥」の意味...
-
シェルスクリプトなどを利用し...
-
「照合パターンに合いません」...
-
ディレクトリ名をショートファ...
-
WriteFileの引数について
-
zorin os lite 15 のデスクトッ...
-
シンボリックリンクを貼る=PAT...
-
SAMBA上に書き込んだファイルの...
-
環境変数のパスのbinの意味につ...
-
計算が実行されません。mv:照合...
-
etcは何の略?
-
unzipコマンドでディレクトリな...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
複数のフォルダを同時に参照し...
-
拡張子.dどういう意味
-
ftpのmgetコマンドの自分の格納...
-
7zを使うとフォルダの中身がす...
-
"cp -a"と"cp -r"の違い
-
make時に出てきたエラーメッセ...
-
scpによるデータ転送後、ディレ...
-
ホームページのディレクトリを...
-
FTPコマンドのCDについて
-
linuxコマンド mkdirでディレ...
-
「ドット(.)」と「¥」の意味...
-
Linuxコマンドについて
-
バッチファルの置き場所
-
/(スラッシュ)で区切ったフル...
-
tarコマンドのエラーについて
-
ファイル名で / (スラッシュ...
-
「照合パターンに合いません」...
-
シンボリックリンクについて
-
linuxで特定のディレクトリのみ...
-
#./configureの時点でダメです。
おすすめ情報