CreateFile()に関して


鈴木  2009-11-30 22:06:59  No: 142897

VisaulBasic2008Exp版を使用しています。

CreateFile()APIを使用してバイナリファイルを読み出したいのですが、
CreateFile()が失敗してその先に進めません。
どなたかアドバイス頂けないでしょうか?

宣言部
Public Declare Function CreateFile Lib "kernel32.dll" Alias CreateFileA" _
(ByVal lpFileName As String,
 ByVal dwDesiredAccess As Integer,
 ByVal dwShareMode As Integer,
 ByRef lpSecurityAttributes As Integer,
 ByVal dwCreationDisposition As Integer,
 ByVal dwFlagsAndAttributes As Integer,
 ByVal hTemplateFile As Integer) As Integer

Public Const GENERIC_READ = &H80000000
Public Const OPEN_EXISTING = 3

関数部
Dim fp As Integer
Dim file As String
file="C:\bin\ABC.bin"
fp = CreateFile(file, GENERIC_READ, 0, 0, OPEN_EXISTING, 0, 0)

上記を実行するとfpに-1が戻ってきて失敗しています。
fileは確実にありますし、大文字小文字を変えてみても変化ありませんでした。


Hongliang  2009-11-30 22:16:40  No: 142898

まずは GetLastError 関数または System.Runtime.InteropServices.Marshal.GetLastWin32Error メソッドを使ってエラーコードを取得し、失敗した理由を探るべきでしょう。

で、それ以前に、一部の特殊な要求を除けば、わざわざ Win32API など使わずとも FileStream で簡単にファイルを扱うことができると思いますが。


鈴木  2009-11-30 23:01:19  No: 142899

>>Hongliang様

早速ありがとうございます。
GetLastError()でエラーコードを確認した所、998(メモリ ロケーションへのアクセスが無効です。)でした。

何が原因なのか調べてみます。
VMware上で動かしているのでこれが原因でしょうか?
FileStreamに関しても調べてみます。


オショウ  2009-12-01 01:47:25  No: 142900

何故、APIで無ければならないのでしょうか・・・
BinaryReaderがあるのに・・・

以上。


Koz  2009-12-01 03:15:39  No: 142901

>ByRef lpSecurityAttributes As Integer,

ここは SECURITY_ATTRIBUTES 構造体へのポインタが入るので、
使わないのであれば、

ByVal lpSecurityAttributes As Integer,

にしてゼロをセットしてください。

みなさん書かれてますが、勉強のためとかでなければ、
.NET のオブジェクトを使うのが無難ですよ。


※返信する前に利用規約をご確認ください。








  このエントリーをはてなブックマークに追加