GetLastError.
5 отговора
108 прегледа
Заключена
GetLastError.
Имам текстов файл път до него е: c:/tequila.txt в който има малко текст и е "захапан" от word. Опитвам да изтрия файла чрез следния код:
Private Declare Function DeleteFile _
Lib "kernel32" Alias "DeleteFileA" ( _
ByVal lpFileName As String _
) As Boolean
Private Declare Function GetLastError Lib "kernel32" () _
As Long
Private Sub Form_Load()
On Error GoTo Form_LoadErr
Dim l_bRes As Boolean
Dim l_lLasrErr As Long
l_bRes = True
l_bRes = DeleteFile("c:/tequila.txt")
l_lLasrErr = GetLastError
Call MsgBox("yes")
Exit Sub
Form_LoadErr:
Call MsgBox("no")
End Sub
Файла не е изтрит освен това няма и помен от това каква е причината. Само l_bRes се обръща в лъжа. Обаче GetLastError трябва да върне грешка 32. Която гласи:
32 The process cannot access the file because it is being used by another process. ERROR_SHARING_VIOLATION
За мен е важно да знам каква е причината за неуспеха и за това номера на грешка върнат от GetLastError е много важен.
Същия код на Си работи и изглежда ето така:
#include <windows.h>
void main()
{
BOOL l_bRes = TRUE;
DWORD l_dwLasrErr = 0;
l_bRes = DeleteFile("c:/tequila.txt");
l_dwLasrErr = GetLastError();
}
Обаче езика Си така не ми върши работа. Единствено се сещам да измайсторя dll на Си в който всички функции които ме интересуват(Win32 API) да ги обвия и да връщам кода върнат от GetLastError. Това ми се вижда разумно обаче вероятно има и друго решение което е по-близо до VB.
Private Declare Function DeleteFile _
Lib "kernel32" Alias "DeleteFileA" ( _
ByVal lpFileName As String _
) As Boolean
Private Declare Function GetLastError Lib "kernel32" () _
As Long
Private Sub Form_Load()
On Error GoTo Form_LoadErr
Dim l_bRes As Boolean
Dim l_lLasrErr As Long
l_bRes = True
l_bRes = DeleteFile("c:/tequila.txt")
l_lLasrErr = GetLastError
Call MsgBox("yes")
Exit Sub
Form_LoadErr:
Call MsgBox("no")
End Sub
Файла не е изтрит освен това няма и помен от това каква е причината. Само l_bRes се обръща в лъжа. Обаче GetLastError трябва да върне грешка 32. Която гласи:
32 The process cannot access the file because it is being used by another process. ERROR_SHARING_VIOLATION
За мен е важно да знам каква е причината за неуспеха и за това номера на грешка върнат от GetLastError е много важен.
Същия код на Си работи и изглежда ето така:
#include <windows.h>
void main()
{
BOOL l_bRes = TRUE;
DWORD l_dwLasrErr = 0;
l_bRes = DeleteFile("c:/tequila.txt");
l_dwLasrErr = GetLastError();
}
Обаче езика Си така не ми върши работа. Единствено се сещам да измайсторя dll на Си в който всички функции които ме интересуват(Win32 API) да ги обвия и да връщам кода върнат от GetLastError. Това ми се вижда разумно обаче вероятно има и друго решение което е по-близо до VB.
Редактирано от Щиpлиц на
Re: GetLastError...
...
Ооооо кого виждам, лудия VB фен, който беше изтъкнал "предимствата" на езика VB в клуб "Програмисти". Гледам, че активно го ползваш тоя език. Защо ли? След като така яко го оплю.
Аз обаче, този път, съм далече от мисълта да се заяждам, а просто пиша за да ти помогна, както всеки един би ти помогнал тук, защото и това е целта на тези клубове - да си помагаме, а не да си пречим един на друг. Аз поне така мисля.
Всъщност, в случая няма как да ти помогна, защото функцията GetLastError е "проблемна" при извикването й от VB. Това може да го приемеш и като недостатък на езика, защото както ти казах още в клуб "Програмисти" VB не е език лишен от недостатъци.
Ето ти и линк, който обяснява проблема:
[линк]
А сега си свободен да оплюеш отново VB, горд, че си намерил поредният проблем... Този път няма да ти преча и няма да ти отговарям
Бии, за да те уважават!
Ооооо кого виждам, лудия VB фен, който беше изтъкнал "предимствата" на езика VB в клуб "Програмисти". Гледам, че активно го ползваш тоя език. Защо ли? След като така яко го оплю.
Аз обаче, този път, съм далече от мисълта да се заяждам, а просто пиша за да ти помогна, както всеки един би ти помогнал тук, защото и това е целта на тези клубове - да си помагаме, а не да си пречим един на друг. Аз поне така мисля.
Всъщност, в случая няма как да ти помогна, защото функцията GetLastError е "проблемна" при извикването й от VB. Това може да го приемеш и като недостатък на езика, защото както ти казах още в клуб "Програмисти" VB не е език лишен от недостатъци.
Ето ти и линк, който обяснява проблема:
[линк]
А сега си свободен да оплюеш отново VB, горд, че си намерил поредният проблем... Този път няма да ти преча и няма да ти отговарям
Бии, за да те уважават!
Редактирано от Щиpлиц на
Re: GetLastError
Знам , че GetLastError е проблемна функция. Също попаднах на разни връзки които обясняват , че не е добре изобщо да се ползва. Междувременно проблема ми се реши:)
Re: ето така
Function IsFileAlreadyOpen(ByVal strFilename As String) As Boolean
Dim hFile As Long
Dim lastErr As Long
' Initialize file handle and error variable.
hFile = -1
lastErr = 0
' Open for for read and exclusive sharing.
hFile = lopen(strFilename, &H10)
' If we couldn't open the file, get the last error.
If hFile = -1 Then
lastErr = Err.LastDllError
' Make sure we close the file on success.
Else
lclose (hFile)
End If
' Check for sharing violation error.
If (hFile = -1) And (lastErr = 32) Then
IsFileAlreadyOpen = True
Else
IsFileAlreadyOpen = False
End If
End Function
Public Function IsOpen(ByVal strFilename As String) As Boolean
Dim i As Integer
i = FreeFile
On Error Resume Next
Open strFilename For Binary Lock Read Write As i
IsOpen = (Err.Number <> 0)
Close i
End Function
Първата изобщо не е в час , а втората поне ми казва ако някой вече е отворил файла. Това макар и съвсем да не е това което търсех е някакво приближение:)
Dim hFile As Long
Dim lastErr As Long
' Initialize file handle and error variable.
hFile = -1
lastErr = 0
' Open for for read and exclusive sharing.
hFile = lopen(strFilename, &H10)
' If we couldn't open the file, get the last error.
If hFile = -1 Then
lastErr = Err.LastDllError
' Make sure we close the file on success.
Else
lclose (hFile)
End If
' Check for sharing violation error.
If (hFile = -1) And (lastErr = 32) Then
IsFileAlreadyOpen = True
Else
IsFileAlreadyOpen = False
End If
End Function
Public Function IsOpen(ByVal strFilename As String) As Boolean
Dim i As Integer
i = FreeFile
On Error Resume Next
Open strFilename For Binary Lock Read Write As i
IsOpen = (Err.Number <> 0)
Close i
End Function
Първата изобщо не е в час , а втората поне ми казва ако някой вече е отворил файла. Това макар и съвсем да не е това което търсех е някакво приближение:)
Re: GetLastError/Err.LastDllError
И така днес съвсем случайно реших да видя какво става когато наглася кода за хващане на грешки и пусна програмата. Да тя хваща грешки! Поне Err.LastDllError има стойноста на последната настъпила грешка. Обаче защо когато сладко си трасирам кода Err.LastDllError вечно си стои на 0(нула)?!