Не работает GetPrivateProfileSectionA...

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Не работает GetPrivateProfileSectionA...

Сообщение Andrey Fedorov » 06.06.2005 (Пн) 15:35

Кто нибудь сталкивался с подобным - на машинах с Win98 (есть у нас еще парочка таких) несколько дней назад перестала работать программа. Разборки привели к тому что в ней перестала работать API-шная функция: GetPrivateProfileSectionA !!!

Объявляется как:

Код: Выделить всё
Public Declare Function GetPrivateProfileSectionA Lib "kernel32" (ByVal lpAppName As String, ByVal lpReturnedString As String, ByVal nSize As Long, ByVal lpFileName As String) As Long


Используется (Функция стала возвращать 0!):

Код: Выделить всё
    Dim s As String, i As Long
    s = Space(16000)
    i = GetPrivateProfileSectionA(sSectionName, s, Len(s), g_sINIFile)


С машин Win2k - все отлично...

Сталкивались с подобным???
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

Igor_123
Осторожный Баянист
Осторожный Баянист
Аватара пользователя
 
Сообщения: 1325
Зарегистрирован: 21.07.2004 (Ср) 13:00
Откуда: Днепропетровск

Сообщение Igor_123 » 06.06.2005 (Пн) 15:43

А чего пишет GetLastError???
Вообще-то нормально работало :shock:
Водки я вам не обещаю, но погуляем хорошо.
И. Сусанин.

Аватара (с) Тёмыч

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 06.06.2005 (Пн) 15:48

Igor_123 писал(а):А чего пишет GetLastError???
Вообще-то нормально работало :shock:


Да я до тех машин толком добраться не могу - отгоняют. :(

Работало нормально и у меня, но дней 5 назад перестало.
Почему - неясно абсолютно... В программе ничего не менялось.

Путь к INI-файлу (он в сети) указан правильный, файл доступен.
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

Igor_123
Осторожный Баянист
Осторожный Баянист
Аватара пользователя
 
Сообщения: 1325
Зарегистрирован: 21.07.2004 (Ср) 13:00
Откуда: Днепропетровск

Сообщение Igor_123 » 06.06.2005 (Пн) 16:02

Может чего-то с доступом

Тут вот ещё:

МСДН писал(а):BUG: GetPrivateProfileSection Opens INI File in Read/Write Mode

Q198906


--------------------------------------------------------------------------------
The information in this article applies to:

Microsoft Win32 Application Programming Interface (API), on platform(s):
Microsoft Windows 95
Microsoft Windows 98

--------------------------------------------------------------------------------


SYMPTOMS
GetPrivateProfileSection sometimes returns 0, even though the specified section is contained in the initialization file.



CAUSE
The GetPrivateProfileSection API opens the initialization file with read and write access. If the initialization file is read only, this function returns 0.



RESOLUTION
You can resolve this error by making a call to GetPrivateProfileString before GetPrivateProfileSection. Make the GetPrivateProfileString call as follows before calling any other profile functions:


char buffer[4096];

GetPrivateProfileString(NULL, NULL, NULL,
buffer, sizeof(buffer), "ABC.INI");
The profile functions are provided for compatibility with 16-bit applications written for Windows. It is recommended that all Win32-based applications store initialization information in the registry and use the Win32 registry APIs to retrieve these values.



STATUS
Microsoft has confirmed this to be a bug in the Microsoft products listed at the beginning of this article.

Additional query words:

Keywords : kbKernBase kbRegistry kbOSWin95 kbOSWin98
Issue type : kbbug
Technology :


Не оно???
Водки я вам не обещаю, но погуляем хорошо.
И. Сусанин.

Аватара (с) Тёмыч

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 06.06.2005 (Пн) 16:22

Andrey, может ini-файлы больше 64Кб вдруг стали?
Изображение

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 06.06.2005 (Пн) 16:48

tyomitch писал(а):Andrey, может ini-файлы больше 64Кб вдруг стали?


Да нет - файл размером < 4 kB.

Так и не пойму - функция просто перестала работать на двух машинах с Win98. На других программах (Офис, 1C и пр. пока никак не сказалось).

Написал на скорую руку свой аналог GetPrivateProfileSectionA, и просто тупо заменил им API-шную функцию - все заработало на ура...

Вот код аналога:

Код: Выделить всё
Public Function GetIniSection(ByVal sSectionName As String, ByRef sReturn As String, ByVal iLen As Long, ByVal sFileName As String) As String
    Static sINI As String
    Dim iHFile As Integer, i As Long, s As String, ss As String, _
        v As Variant, vv As Variant, b As Boolean, bb As Boolean, _
        s1 As String, s2 As String

    Dim sss As New StringBuilder
    On Error GoTo Err_
    If Len(sINI) = 0 Then
        iHFile = FreeFile
        Open sFileName For Binary As #iHFile
        s = Space$(LOF(iHFile))
        Get #iHFile, , s
        Close #iHFile
    End If
    v = Split(s, vbCrLf)
    ss = "[" & sSectionName & "]"
    For i = 0 To UBound(v)
        s = Trim$(v(i))
        If Left$(s, 1) = "[" And Right$(s, 1) = "]" Then
            If bb Then Exit For
            If 0 = StrComp(s, ss, vbTextCompare) Then
                b = True: bb = True
            Else
                b = False
            End If
        Else
            If b Then
                If Len(s) Then
                    If Left$(s, 1) <> ";" Then
                        vv = Split(s, "=", 2)
                        If UBound(vv) = 1 Then
                            s1 = RTrim$(vv(0)): s2 = LTrim$(vv(1))
                            If Len(s1) > 0 And Len(s2) > 0 Then
                                If sss.Length Then sss.Append Chr(0)
                                sss.Append s1 & "=" & s2
                            End If
                        End If
                    End If
                End If
            End If
        End If
    Next i
    sReturn = sss
    GetIniSection = sss.Length
    Exit Function
   
Err_:
    On Error Resume Next
    If iHFile Then Close iHFile
End Function
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 06.06.2005 (Пн) 16:50

Ну тебе ж привели статью из MSDN...
Сними атрибут ReadOnly с файлов...
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 06.06.2005 (Пн) 17:16

GSerg писал(а):Ну тебе ж привели статью из MSDN...
Сними атрибут ReadOnly с файлов...


Тьфу. Точно.

Ну атрибут я явно снимать не буду - лучше переделаю следующим образом:

Код: Выделить всё
Public Function GetPrivateProfileSection(ByVal sSection As String, ByRef sReturnedString As String, ByVal iSize As Long, ByVal sFileName As String) As Long
    GetPrivateProfileStringA vbNullChar, vbNullChar, vbNullChar, sReturnedString, iSize, sFileName
    GetPrivateProfileSection = GetPrivateProfileSectionA(sSection, sReturnedString, iSize, sFileName)
End Function
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Google-бот и гости: 188

    TopList