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で質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
あるあるbotに投稿したけど採用されなかったあるある募集
あるあるbotに投稿したけど採用されなかったあるあるをこちらに投稿してください
-
フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
あなたが普段思っている「これまだ誰も言ってなかったけど共感されるだろうな」というあるあるを教えてください
-
映画のエンドロール観る派?観ない派?
映画が終わった後、すぐに席を立って帰る方もちらほら見かけます。皆さんはエンドロールの最後まで観ていきますか?
-
海外旅行から帰ってきたら、まず何を食べる?
帰国して1番食べたくなるもの、食べたくなるだろうなと思うもの、皆さんはありますか?
-
天使と悪魔選手権
悪魔がこんなささやきをしていたら、天使のあなたはなんと言って止めますか?
-
WriteFile関数
C言語・C++・C#
-
WaitForSingleObjectの使い方について
C言語・C++・C#
-
シリアル通信時のデータ受信方法
Visual Basic(VBA)
-
-
4
VBA2005 16進を2桁で表示したい。
Visual Basic(VBA)
-
5
HANDLEの宣言でのエラー
C言語・C++・C#
-
6
DWORDの実際の型は何でしょうか
C言語・C++・C#
-
7
WriteFile()でのデータ送信ができなくなる
C言語・C++・C#
-
8
#pragma commentの相対パス指定
C言語・C++・C#
-
9
_T(abcdef") の_Tってなんですか?"
C言語・C++・C#
-
10
<unistd.h>をVisualStudioでつかえるようにする
C言語・C++・C#
-
11
VBAを使用して、USBでつないだ機器の制御が出来るでしょうか?
Access(アクセス)
-
12
エクセル VBA でのCOMポート認識
その他(プログラミング・Web制作)
-
13
VC++ 2008 EXPRESS _T"識別子がみつかりません"
C言語・C++・C#
-
14
C言語のPathFileExistsについて
C言語・C++・C#
-
15
メッセージボックスを前面に表示させるには?
Visual Basic(VBA)
-
16
Vba LongPtrについて教えてください
Visual Basic(VBA)
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
7zを使うとフォルダの中身がす...
-
make時に出てきたエラーメッセ...
-
「照合パターンに合いません」...
-
ファイル名で / (スラッシュ...
-
"cp -a"と"cp -r"の違い
-
Linuxコマンドについて
-
ホームページのディレクトリを...
-
FTPコマンドのCDについて
-
ftpのmgetコマンドの自分の格納...
-
バッチファルの置き場所
-
URLの末尾の『/』の意味
-
zorin os lite 15 のデスクトッ...
-
拡張子.dどういう意味
-
プログラム資産ってなんですか
-
仮想ディレクトリと通常ディレ...
-
FTPでPUTできない原因は何?
-
コンパイルできない!
-
Minecraftにforgeを入れたら、...
-
ssh(telnet)ログイン時のアクセ...
-
古いファイルやディレクトリを...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ftpのmgetコマンドの自分の格納...
-
ホームページのディレクトリを...
-
拡張子.dどういう意味
-
scpによるデータ転送後、ディレ...
-
FTPコマンドのCDについて
-
7zを使うとフォルダの中身がす...
-
make時に出てきたエラーメッセ...
-
「ドット(.)」と「¥」の意味...
-
バッチファルの置き場所
-
ファイル名で / (スラッシュ...
-
FTPでPUTできない原因は何?
-
linuxコマンド mkdirでディレ...
-
Linuxコマンドについて
-
linuxのコマンドラインで、拡張...
-
2TBのUSBメモリを2000円ほどで...
-
「照合パターンに合いません」...
-
/(スラッシュ)で区切ったフル...
-
ftpでのフォルダごとの転送はで...
-
unzipコマンドでディレクトリな...
-
"cp -a"と"cp -r"の違い
おすすめ情報