GetLastError.

5 отговора 108 прегледа Заключена
#1

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.

Редактирано от Щиpлиц на

Отговор
в отговор на bugicha #2

Re: GetLastError...

...
Ооооо кого виждам, лудия VB фен, който беше изтъкнал "предимствата" на езика VB в клуб "Програмисти". Гледам, че активно го ползваш тоя език. Защо ли? След като така яко го оплю.
Аз обаче, този път, съм далече от мисълта да се заяждам, а просто пиша за да ти помогна, както всеки един би ти помогнал тук, защото и това е целта на тези клубове - да си помагаме, а не да си пречим един на друг. Аз поне така мисля.
Всъщност, в случая няма как да ти помогна, защото функцията GetLastError е "проблемна" при извикването й от VB. Това може да го приемеш и като недостатък на езика, защото както ти казах още в клуб "Програмисти" VB не е език лишен от недостатъци.
Ето ти и линк, който обяснява проблема:
[линк]

А сега си свободен да оплюеш отново VB, горд, че си намерил поредният проблем... Този път няма да ти преча и няма да ти отговарям

Бии, за да те уважават!

Редактирано от Щиpлиц на

Отговор
в отговор на пpoГЪPMИcт #3

Re: GetLastError

Знам , че GetLastError е проблемна функция. Също попаднах на разни връзки които обясняват , че не е добре изобщо да се ползва. Междувременно проблема ми се реши:)

Отговор
в отговор на bugicha #4

Re: GetLastError

как?

Отговор
в отговор на Werewolf #5

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

Първата изобщо не е в час , а втората поне ми казва ако някой вече е отворил файла. Това макар и съвсем да не е това което търсех е някакво приближение:)

Отговор
в отговор на bugicha #6

Re: GetLastError/Err.LastDllError

И така днес съвсем случайно реших да видя какво става когато наглася кода за хващане на грешки и пусна програмата. Да тя хваща грешки! Поне Err.LastDllError има стойноста на последната настъпила грешка. Обаче защо когато сладко си трасирам кода Err.LastDllError вечно си стои на 0(нула)?!

Отговор