Application Error crashes the program

Posted on 2000-03-09
Last Modified: 2010-05-02

I still have my Application Error when calling the Win32 ReadFile function. Below is my code. The WriteFile works well, and the file written to is correct.
So, whats wrong.

Public Declare Function ReadFile Lib "kernel32" Alias "ReadFile" (ByVal hFile As Long, lpBuffer As Any, ByVal nNumberOfBytesToRead As Long, lpNumberOfBytesRead As Long, lpOverlapped As OVERLAPPED) As Long
Private Type Record   ' Define user-defined type.
   ID As Integer
   LD As Long
   Name As String * 20
   Surname As String
End Type

Sub ReadBinary()
    Dim handle, res, bytesRead, length As Long
    Dim nul As Variant
    Dim ov As OVERLAPPED
    Dim txt As String
    Dim buffer As String * 10
    Dim MyRecord As Record   ' Declare variable.
    sa.nLength = 0
    sa.lpSecurityDescriptor = 0
    sa.bInheritHandle = 0
    ov.Internal = 0
    ov.InternalHigh = 0
    ov.offset = 0
    ov.OffsetHigh = 0
    ov.hEvent = 0
    handle = CreateFile("c:\bas.bin", _
                        GENERIC_READ Or GENERIC_WRITE, _
                        0, _
                        sa, _
                        OPEN_EXISTING, _
                        0, _
    If handle = INVALID_HANDLE_VALUE Then
        Win32Error "CreateFile", GetLastError
        length = Len(buffer)
        res = ReadFile(handle, buffer, length, bytesRead, vbNull)
' below the old code, which also does not work
'        length = Len(MyRecord)
'        res = ReadFile(handle, MyRecord, length, bytesRead, vbNull)
        If res = 0 Then
            Win32Error "ReadFile", GetLastError
        res = CloseHandle(handle)
        If res = 0 Then
            Win32Error "CloseHandle", GetLastError
        End If
    End If
    txt = "MyRecord: Id=" & MyRecord.ID & " LD=" & MyRecord.LD & " name=" & MyRecord.Name & " Surname=" & MyRecord.Surname
    MsgBox txt, vbInformation, "ReadBinary"
End Sub

Question by:poupou
  • 2
  • 2
  • 2
  • +2

Expert Comment

ID: 2600864
Initially I think that it may be because bytesRead is not declared anywhere which would make it of type variant. Try using Option Explicit at the top of your module.

Expert Comment

ID: 2600946

I think you better chang your function call to ReadFile like this

res = ReadFile(handle, BYVAL buffer, length, bytesRead, CLng(0))

You must add the Byval keyword before passing the 'String' buffer to the ReadFile API function !

Have a look at this link, it's all explained and there is also a 'Visual Basic Specific' section on the page !!

Hope this will work.


Accepted Solution

PatrickVD earned 50 total points
ID: 2600988

I think you better change your function call to ReadFile like this:

res = ReadFile(handle, BYVAL buffer, length, bytesRead, CLng(0))

You must add the Byval keyword before passing the 'String' buffer to the ReadFile API function !
I don't this you can use the vbNull as last parameter either. If you don't want the overlapped functionality, then you should use CLng(0) instead.

Have a look at this link, it's all explained and there is also a 'Visual Basic Specific' section on the page !!

Give this a try.
Hope this will work.

Technology Partners: We Want Your Opinion!

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!


Expert Comment

ID: 2601050
Oh yeah, I didn't see that. Definitely listen to PatrickVD, I'm sure that's it (although you should also check bytesRead but I'd give the points to PatrickVD).
LVL 14

Expert Comment

ID: 2602148
Nice code.. but for the life of me I can't understand why you are using a Readfile API rather than just a simple VB Open Binary - Get - Put routine. What am I missing here?

Expert Comment

ID: 2603272

A few notes that may help:

1. The way you declare your Long variables is incorrect and will result in all but one of them being defined as Variants. In VB, you can't define a list of variables as a certain data type like you can in C++. Define each one individually. ("Dim handle As Long", "Dim res As Long", etc.)

2. Change your ReadFile API declaration's lpOverlapped argument to "ByVal lpOverlapped As Long" instead of "lpOverlapped As OVERLAPPED". Pass a value of zero to the function for this argument instead of VbNull (which has a value of 1).

Finally, like wsh2 I have to wonder why you're going through the trouble of using the ReadFile function instead of using regular Binary file access functions.

Good luck,

LVL 14

Expert Comment

ID: 2603290
<Smiling, batting eyelashes and speaking in sultry southern voice>.. "C'mon poupou,".. <wink> <wink>.. "Enquiring Expert minds wanna know!".. <smile>.

Author Comment

ID: 2611694
thanks PatrickVD for your help,

just adding the ByVal before the buffer parameter stops my pg to crash.

comment for rob and wsh2:
using the standard put and get is effectively a better way to access binary file.
But I just don't like my applications to crash without finding the problem.

Featured Post

Free Tool: Path Explorer

An intuitive utility to help find the CSS path to UI elements on a webpage. These paths are used frequently in a variety of front-end development and QA automation tasks.

One of a set of tools we're offering as a way of saying thank you for being a part of the community.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Suggested Solutions

Title # Comments Views Activity
TT Auto Dashboard 13 100
Excel Automation VBA 19 102
RUNRMTCMD from AS/400 13 89
checkbox to hide entire section 10 58
The debugging module of the VB 6 IDE can be accessed by way of the Debug menu item. That menu item can normally be found in the IDE's main menu line as shown in this picture.   There is also a companion Debug Toolbar that looks like the followin…
You can of course define an array to hold data that is of a particular type like an array of Strings to hold customer names or an array of Doubles to hold customer sales, but what do you do if you want to coordinate that data? This article describes…
Get people started with the utilization of class modules. Class modules can be a powerful tool in Microsoft Access. They allow you to create self-contained objects that encapsulate functionality. They can easily hide the complexity of a process from…
This lesson covers basic error handling code in Microsoft Excel using VBA. This is the first lesson in a 3-part series that uses code to loop through an Excel spreadsheet in VBA and then fix errors, taking advantage of error handling code. This l…

740 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question