powered by simpleCommunicator - 2.0.52     © 2025 Programmizd 02
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / VB6, Win32 WriteFile() -> ERROR_INVALID_HANDLE
12 сообщений из 12, страница 1 из 1
VB6, Win32 WriteFile() -> ERROR_INVALID_HANDLE
    #38598536
nrmBeginner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
hExportFile = CreateFile(strPath & "\" & strFileName _
    , GENERIC_WRITE _
    , 0 _
    , 0 _
    , OPEN_ALWAYS _
    , FILE_ATTRIBUTE_NORMAL _
    , 0 _
)

WriteFile hExportFile, ByVal stringToWrite, Len(stringToWrite), nWritten, 0


вызывает ERROR_INVALID_HANDLE при выполнении в среде, что и является проблемой, если же сделать exe-шник, то он выполняет этот код без ошибок. В чем причина и как побороть? Заранее благодарю.
...
Рейтинг: 0 / 0
VB6, Win32 WriteFile() -> ERROR_INVALID_HANDLE
    #38598553
Фотография VSVLAD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nrmBeginner,

Какие значения в момент вызова у переменных strPath, strFileName. Как задекларирована CreateFile и константы.
...
Рейтинг: 0 / 0
VB6, Win32 WriteFile() -> ERROR_INVALID_HANDLE
    #38598556
Фотография VSVLAD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код ниже отрабатывает как в IDE, так и в EXE. Что возвращает WriteFile? Что возвращает GetLastDLLError?
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
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
                    
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long

Private Const GENERIC_WRITE = &H40000000
Private Const OPEN_ALWAYS = 4
Private Const FILE_ATTRIBUTE_NORMAL = &H80

Private Sub Form_Load()
    Dim hExportFile As Long, nWritten As Long
    Dim stringToWrite As String
    
    hExportFile = CreateFile("C:\Test.txt" _
        , GENERIC_WRITE _
        , 0 _
        , 0 _
        , OPEN_ALWAYS _
        , FILE_ATTRIBUTE_NORMAL _
        , 0 _
    )
    
    stringToWrite = "Hello World!"
    WriteFile hExportFile, ByVal stringToWrite, Len(stringToWrite), nWritten, 0
    
    CloseHandle hExportFile
End Sub

...
Рейтинг: 0 / 0
VB6, Win32 WriteFile() -> ERROR_INVALID_HANDLE
    #38598570
nrmBeginner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VSVLAD,

Объявления идентичные приведенным один в один, в strPath и strFileName путь и имя файла в локальной ФС соответственно (например опробовано d:\temp\export.txt), WriteFile возвращает 0, GetLastDLLError как раз и возвращает ERROR_INVALID_HANDLE тольк в ипостаси Err.LastDllError.
...
Рейтинг: 0 / 0
VB6, Win32 WriteFile() -> ERROR_INVALID_HANDLE
    #38598581
nrmBeginner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добавился еще один прикол. Написал отдельно вот такой код
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
Sub f2()
    Dim hExportFile As Long
    Dim nWritten As Long
    Dim LastDllError As Long
    Dim nret As Long
    
    Dim stringToWrite As String
    stringToWrite = "stringToWrite"
    
    hExportFile = CreateFile("D:\temp\export.txt" _
        , GENERIC_WRITE _
        , 0 _
        , 0 _
        , OPEN_ALWAYS _
        , FILE_ATTRIBUTE_NORMAL _
        , 0 _
    )
    
    nret = WriteFile(hExportFile, ByVal stringToWrite, Len(stringToWrite), nWritten, 0)
    LastDllError = Err.LastDllError
    MsgBox LastDllError
    MsgBox "nret: " & nret
    CloseHandle hExportFile
End Sub


Так он теперь на месте вызова WriteFile фэйлит процесс среды с выбросом предложения отправить отчет разработчику, а файл D:\temp\export.txt принимает рандомный размер. Первый раз было полтора мегабайта, второй раз файл вырос аж в 59 метров, содержимое - все нули, а в начале файла или в конце красуется "stringToWrite", очень уж не похоже на размер Len(stringToWrite).
...
Рейтинг: 0 / 0
VB6, Win32 WriteFile() -> ERROR_INVALID_HANDLE
    #38598597
Казанский
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А что за суровая необходимость использовать API для записи файла? Почему не Open...Put...Close?
Вы строку в каком виде хотите записать - как она в памяти лежит в Unicode (2 байта на символ) или в локальной кодировке (1 байт на символ)?
...
Рейтинг: 0 / 0
VB6, Win32 WriteFile() -> ERROR_INVALID_HANDLE
    #38598615
nrmBeginner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Казанский,

windows-1251. Системные апи лучше.
...
Рейтинг: 0 / 0
VB6, Win32 WriteFile() -> ERROR_INVALID_HANDLE
    #38598736
Фотография VSVLAD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nrmBeginner,

покажите задекларированные API. Также попробуйте накатить среду по новой из инсталлятора, возможно поможет, не раз видел необъяснимые чудо-глюки.
...
Рейтинг: 0 / 0
VB6, Win32 WriteFile() -> ERROR_INVALID_HANDLE
    #38599036
nrmBeginner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VSVLAD,

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
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

Declare Function WriteFile Lib "kernel32" (ByVal hFile As Long, lpBuffer As Any, ByVal nNumberOfBytesToWrite As Long, lpNumberOfBytesWritten As Long, lpOverlapped As Long) As Long

Public Const GENERIC_WRITE = &H40000000
Public Const OPEN_ALWAYS = 4
Public Const FILE_ATTRIBUTE_NORMAL = &H80



Теперь вообще все поменялось, я понять не могу от чего это зависит: если stringToWrite объявляется как константа то процесс каршится и в файле кракозябры с кучей нулей до или после, если объявляется как локальная переменная то теперь GetLastError выдает ERROR_INVALID_PARAMETER, если как глобальная переменная то крашится, но уже в файле содержимое stringToWrite с кучей нулей до или после.
...
Рейтинг: 0 / 0
VB6, Win32 WriteFile() -> ERROR_INVALID_HANDLE
    #38599042
nrmBeginner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кстати попробовал на другом компьютере, все то же самое, и даже попробовал в мс оффисе 2010, то же самое.
...
Рейтинг: 0 / 0
VB6, Win32 WriteFile() -> ERROR_INVALID_HANDLE
    #38599045
nrmBeginner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Может кто попробует у себя код:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
Sub f2()
    Dim hExportFile As Long
    Dim nWritten As Long
    Dim LastDllError As Long
    
    Dim stringToWrite As String
    Dim lenToWrite As Long
    
    stringToWrite = "stringToWrite"
    'Const stringToWrite As String = "stringToWrite"
    lenToWrite = Len(stringToWrite)
    
    
    Const strPathFile As String = "D:\temp\export.txt"
    
    hExportFile = CreateFile(strPathFile _
        , GENERIC_WRITE _
        , 0 _
        , 0 _
        , OPEN_ALWAYS _
        , FILE_ATTRIBUTE_NORMAL _
        , 0 _
    )
    
    nWritten = 10
    WriteFile hExportFile, ByVal stringToWrite, lenToWrite, nWritten, 0
    LastDllError = Err.LastDllError
    MsgBox LastDllError
    CloseHandle hExportFile
End Sub

...
Рейтинг: 0 / 0
VB6, Win32 WriteFile() -> ERROR_INVALID_HANDLE
    #38599102
nrmBeginner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нашел! Боже, вот же я слепой. Моя декларация WriteFile передавала последний параметр 0 по ссылке. Получалось что я передавал структуру OVERLAPPED с неизвестным содержимым.
Всем огромнейшее спасибо за отзывчивость.
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / VB6, Win32 WriteFile() -> ERROR_INVALID_HANDLE
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]