Microsoft KB Archive/214674

= PRB: Cannot Simultaneously Write to Disk File and Have It Opened in ActiveX DLL =

Article ID: 214674

Article Last Modified on 5/12/2003

-

APPLIES TO


 * Microsoft Visual Basic 5.0 Learning Edition
 * Microsoft Visual Basic 6.0 Learning Edition
 * Microsoft Visual Basic 5.0 Professional Edition
 * Microsoft Visual Basic 6.0 Professional Edition
 * Microsoft Visual Basic 5.0 Enterprise Edition
 * Microsoft Visual Basic 6.0 Enterprise Edition

-



This article was previously published under Q214674



SYMPTOMS
When you attempt to write to the file number of a file that was opened in an ActiveX DLL or vice versa, the following run-time error is generated:

Error '52' Bad File name or number



CAUSE
The file number created when a file is opened cannot be shared between separate projects or executable modules.



RESOLUTION
If a file must be accessed by both an EXE and an associated DLL, wrap all of the file access activities in a class module in the ActiveX DLL.



STATUS
This behavior is by design.



Steps to Reproduce Behavior
 Create an ActiveX DLL project. Class1 is added by default. From the Project menu, click Project Properties. Change the Project Name to DllFileNumber and click OK.  Add the following code to the General Declarations section of Class1: Option Explicit

Private m_Fn As Integer

Public Sub WriteFile(Fn As Variant) Write #Fn, "This is a text from the DLL." End Sub

Public Sub OpenFile m_Fn = FreeFile Open "C:\DllTEST.txt" For Append As #m_Fn End Sub

Private Sub Class_Initialize m_Fn = 0 End Sub

Public Property Get DLLFileNum As Variant DLLFileNum = m_Fn End Property

Public Sub CloseFile If m_Fn <> 0 Then Close #m_Fn m_Fn = 0 End If End Sub  Save the ActiveX Dll project. From the File menu, click Add Project and add a Standard EXE project. Form1 is added by default.</li> In the project window, set the Standard EXE project as the Start Up project by right-clicking on the project name and clicking "Set as Start Up" in the pop-up menu.</li> From the Project menu, click References and check the DllFileNumber entry.</li> Add two CommandButtons to Form1: Command1 and Command2 will be added by default. If a size larger than the default is used, the captions will be more readable.</li>  Add the following code to the General Declarations section of Form1: Option Explicit

Private Sub Command1_Click Dim objvar As New DllFileNumber.Class1 Dim sVar As String

sVar = "This is text from the main program." objvar.OpenFile objvar.WriteFile objvar.DLLFileNum Write #objvar.DLLFileNum, sVar 'Error 52 occurs here. objvar.CloseFile End Sub

Private Sub Command2_Click

Dim FileNumber As Variant Dim objvar As New DllFileNumber.Class1

FileNumber = FreeFile

Open "C:\TEST.txt" For Append As #FileNumber Write #FileNumber, "This is text from the main program."

objvar.WriteFile FileNumber 'Error 52 occurs here.

Close #FileNumber End Sub

Private Sub Form_Load Command1.Caption = "Write to a file opened in the DLL" Command2.Caption = "Write to a file opened in the main program" End Sub </li> Run the program and click on the button labeled "Write to a file opened in the DLL." A Run-Time error 52 will occur on the line of Write statement. End the program.</li> Run the program again and click on the button labeled "Write to a file opened in the main program." A Run-Time error 52 will occur on the line containing the WriteFile method.</li></ol>

Resolution
<ol>  Comment out the code lines containing the following comment: ' Error 52 occurs here. </li> Run the program again and click each CommandButton. No error will occur.</li></ol>

Additional query words: kbGrpVB

Keywords: kbdll kbprb KB214674

-

[mailto:TECHNET@MICROSOFT.COM Send feedback to Microsoft]

© Microsoft Corporation. All rights reserved.