Гость
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / VB6, Win32 WriteFile() -> ERROR_INVALID_HANDLE / 12 сообщений из 12, страница 1 из 1
27.03.2014, 21:21
    #38598536
nrmBeginner
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VB6, Win32 WriteFile() -> ERROR_INVALID_HANDLE
Код
Код: 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
27.03.2014, 21:46
    #38598553
VSVLAD
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VB6, Win32 WriteFile() -> ERROR_INVALID_HANDLE
nrmBeginner,

Какие значения в момент вызова у переменных strPath, strFileName. Как задекларирована CreateFile и константы.
...
Рейтинг: 0 / 0
27.03.2014, 22:01
    #38598556
VSVLAD
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VB6, Win32 WriteFile() -> ERROR_INVALID_HANDLE
Код ниже отрабатывает как в 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
27.03.2014, 22:29
    #38598570
nrmBeginner
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VB6, Win32 WriteFile() -> ERROR_INVALID_HANDLE
VSVLAD,

Объявления идентичные приведенным один в один, в strPath и strFileName путь и имя файла в локальной ФС соответственно (например опробовано d:\temp\export.txt), WriteFile возвращает 0, GetLastDLLError как раз и возвращает ERROR_INVALID_HANDLE тольк в ипостаси Err.LastDllError.
...
Рейтинг: 0 / 0
27.03.2014, 22:44
    #38598581
nrmBeginner
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VB6, Win32 WriteFile() -> ERROR_INVALID_HANDLE
Добавился еще один прикол. Написал отдельно вот такой код
Код: 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
27.03.2014, 23:03
    #38598597
Казанский
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VB6, Win32 WriteFile() -> ERROR_INVALID_HANDLE
А что за суровая необходимость использовать API для записи файла? Почему не Open...Put...Close?
Вы строку в каком виде хотите записать - как она в памяти лежит в Unicode (2 байта на символ) или в локальной кодировке (1 байт на символ)?
...
Рейтинг: 0 / 0
27.03.2014, 23:29
    #38598615
nrmBeginner
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VB6, Win32 WriteFile() -> ERROR_INVALID_HANDLE
Казанский,

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

покажите задекларированные API. Также попробуйте накатить среду по новой из инсталлятора, возможно поможет, не раз видел необъяснимые чудо-глюки.
...
Рейтинг: 0 / 0
28.03.2014, 12:44
    #38599036
nrmBeginner
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VB6, Win32 WriteFile() -> ERROR_INVALID_HANDLE
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
28.03.2014, 12:45
    #38599042
nrmBeginner
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VB6, Win32 WriteFile() -> ERROR_INVALID_HANDLE
Кстати попробовал на другом компьютере, все то же самое, и даже попробовал в мс оффисе 2010, то же самое.
...
Рейтинг: 0 / 0
28.03.2014, 12:47
    #38599045
nrmBeginner
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VB6, Win32 WriteFile() -> ERROR_INVALID_HANDLE
Может кто попробует у себя код:
Код: 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
28.03.2014, 13:18
    #38599102
nrmBeginner
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VB6, Win32 WriteFile() -> ERROR_INVALID_HANDLE
Нашел! Боже, вот же я слепой. Моя декларация WriteFile передавала последний параметр 0 по ссылке. Получалось что я передавал структуру OVERLAPPED с неизвестным содержимым.
Всем огромнейшее спасибо за отзывчивость.
...
Рейтинг: 0 / 0
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / VB6, Win32 WriteFile() -> ERROR_INVALID_HANDLE / 12 сообщений из 12, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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