Страница: 1 |
Люди, объясните почему такой код сработал правильно. Ведь VB и PB по разному хранят строки в памяти. === VB --- Private Declare Function RetW Lib "RetW.dll" (ByRef StrW As String) As Long Private Sub Form_Load() Dim StringW As String StringW = "Hello" Call RetW(StringW) MsgBox StringW End Sub === --- === PB --- #Compile Dll "RetW.dll" %DLL_PROCESS_ATTACH = 1 Function LibMain ( _ ByVal hInstance As Long, _ ByVal Reason As Long, _ ByVal Reserved As Long) Export As Long Select Case Reason Case %DLL_PROCESS_ATTACH LibMain = 1 Exit Function End Select LibMain = 0 'failure! End Function Function RetW Alias "RetW" (ByRef StrW As String) Export As Long StrW=StrW & " World !" End Function
VB хранит строки в UNICODE, а PB в ANSI, может из-за этого... Должно же быть какое то объяснение этому феномену. Целый месяц ковырял PB, пришед к выводу, что он ведет себя несколько непредсказуемо. То, что не должно работать - работает, а что должно - нет. Самое непонятное - некоторые конструкции сегодня работают, а завтра могут отказать безо всяких на то причин. Вот пример: была ф-ция создания и при выходе из программ - уничтожения шрифтов и кистей (все переменные - GLOBAL) IF Flag THEN ' создаем Эта ф-ция работала несколько дней и затем отказала безо всяких на то причин Ни сама ф-ция, ни её объявление, ни её вызов не изменились. При компиляции стала появляться ошибка при создании кистей - Relative Operator Expected и курсор становится после CreateSolidBrush перед (RGB(0,100,200)) ??? Какой может ещё здесь требоваться оператор, и почему он не требовался вчера и позавчера - непонятно ..... Обычная API. Пробовал по-всякому(вплоть до переинсталляции PB) - не заработало, пока не сделал так: перенес создание в WINMAIN, а удаление так и осталось в старой ф-ции IF Flag THEN ' создаем ELSE 'уничтожаем созданные объекты И в таком виде работает. IMHO, PB - вещь чрезвычайно глючная и непредсказуемая. Не подтвердить ни опровергнуть твоё утверждение не могу, т.к. не пользуюсь PBForms напрямую - только копирую код оттуда. Хотя вполне вероятно что в твоём коде закралась ошибка. Когда у меня "глючит" PB, то я первым делом грешу на себя. В большинстве случаев "глюк" оказывается в моём коде. Бывают и непонятные миражи, но они исчезают также, как и возникают. Скорее всего это связанно не с компилятором а с системой. Например поиграл в крутую игруху или запустил пару раз Vb.Net. Из больших перегрузок бывает система не всегда выходит с блеском, а слегка потрепаной. От делать мне больше нечего... Ну ладно, давай свой код - гляну. Страница: 1 |
Вопрос: VB-Строка в PB
Добавлено: 17.03.04 23:00
Автор вопроса: @CyRax PTR | Web-сайт:
Ответы
Всего ответов: 7
Номер ответа: 1
Автор ответа:
alex
Вопросов: 84
Ответов: 453
Профиль | | #1
Добавлено: 18.03.04 18:23
Номер ответа: 2
Автор ответа:
@CyRax PTR
ICQ: 204447456
Вопросов: 28
Ответов: 664
Web-сайт:
Профиль | | #2
Добавлено: 18.03.04 23:27
Номер ответа: 3
Автор ответа:
cresta
Вопросов: 117
Ответов: 1538
Профиль | | #3
Добавлено: 20.03.04 10:26
FUNCTION CreateFonts(Flag AS LONG) AS LONG ' Создание шрифтов
'CreateFonts 1
hBrush = CreateSolidBrush (RGB(42,180,248))
hBrush1 = CreateSolidBrush (RGB(0,100,200))
hBrush2 = CreateSolidBrush (RGB(220,0,0))
hFont1 = PBFormsMakeFont("Verdana", 9*FontSize, 400, %False, %False, %False, 204)
hFont2 = PBFormsMakeFont("Verdana", 8*FontSize, 400, %False, %False, %False, 204)
hFont3 = PBFormsMakeFont("Verdana", 6*FontSize, 400, %False, %False, %False, 204)
hFont4 = PBFormsMakeFont("Verdana", 8*FontSize, 800, %False, %False, %False, 204)
hFont5 = PBFormsMakeFont("Verdana", 8*FontSize, 800, %True, %False, %False, 204)
ELSE 'уничтожаем созданные объекты
 eleteObject hFont1
 eleteObject hFont2
 eleteObject hFont3
 eleteObject hFont4
 eleteObject hFont5
 eleteObject hBrush
 eleteObject hBrush1
 eleteObject hBrush2
END IF
END FUNCTION
FUNCTION WINMAIN (BYVAL hInstance AS DWORD, BYVAL hPrevInstance AS DWORD, _
BYVAL lpCmdLine AS ASCIIZ PTR, BYVAL iCmdShow AS LONG) AS LONG
'
'CreateFonts 1
hBrush = CreateSolidBrush (RGB(42,180,248))
hBrush1 = CreateSolidBrush (RGB(0,100,200))
hBrush2 = CreateSolidBrush (RGB(220,0,0))
hFont1 = PBFormsMakeFont("Verdana", 9*FontSize, 400, %False, %False, %False, 204)
hFont2 = PBFormsMakeFont("Verdana", 8*FontSize, 400, %False, %False, %False, 204)
hFont3 = PBFormsMakeFont("Verdana", 6*FontSize, 400, %False, %False, %False, 204)
hFont4 = PBFormsMakeFont("Verdana", 8*FontSize, 800, %False, %False, %False, 204)
hFont5 = PBFormsMakeFont("Verdana", 8*FontSize, 800, %True, %False, %False, 204)
'
'
 IALOG SHOW MODAL hWnd, CALL WndProc
CreateFonts 0
END FUNCTION
FUNCTION CreateFonts(Flag AS LONG) AS LONG ' Создание шрифтов
 eleteObject hFont1
 eleteObject hFont2
 eleteObject hFont3
 eleteObject hFont4
 eleteObject hFont5
 eleteObject hBrush
 eleteObject hBrush1
 eleteObject hBrush2
END IF
END FUNCTION
Ещё пример - поставил программу в автозагрузку (в ключ RUN). Два дня не хотела запускаться при загрузке Windows(возникала ошибка и предлагалось отправить отчёт о ней, хотя вручную прога запускается и работает без проблем) , а затем опять же безо всяких изменений вдруг стала запускаться нормально. И таких примеров валом. Просто вспомнились самые последние. Как - это называется - непонятно. IMHO, этот язык программирования надо было назвать не PB а GB (ГлюкБейсик). Видимо это и есть причина того, что за столько лет своего существования он так и не получил сколько-нибудь значительного распространения. Какой-то недоделанный гибрид VB & C++
Так что, CyRax, думаю, что объяснение этому твоему феномену - самый банальный глюк. Что касается строк, то я тоже намучался, пока переводил то в UNICODE, то ANSI, пытаясь прописать в реестре значения. Выдавало какую-то бредятину. В конце концов при помощи волшебного слова Сим-Сим и ещё каких-то слов прописал таки строку. Причем не переводя в UNICODE, и при этом только используя как строковую переменную фиксированной длины.
Так что, если хочется скорости, нужен не РВ, а Си...
Номер ответа: 4
Автор ответа:
@CyRax PTR
ICQ: 204447456
Вопросов: 28
Ответов: 664
Web-сайт:
Профиль | | #4
Добавлено: 28.03.04 08:17
Но вполне допускаю. Форум PowerBasic.com так и кишит сообщениями типа "Ещё один глюк PBForms".
Номер ответа: 5
Автор ответа:
cresta
Вопросов: 117
Ответов: 1538
Профиль | | #5
Добавлено: 28.03.04 14:44
Вещи которые изначально не получаются - вполне допускаю, что это мои ошибки. В этом случае стараюсь повторить то же в VB, чтобы все понять и разобраться. Но вот то, что программа работает когда захочет - это несерьёзно. Случай с автозагрузкой (см. выше) : через несколько дней нормальной работы вновь перестала запускаться программа при загрузке компа. Как можно после этого расчитывать на то, что программа, написаная тобой будет стабильно работать, как например VB-шная.
Номер ответа: 6
Автор ответа:
@CyRax PTR
ICQ: 204447456
Вопросов: 28
Ответов: 664
Web-сайт:
Профиль | | #6
Добавлено: 28.03.04 16:31
Номер ответа: 7
Автор ответа:
cresta
Вопросов: 117
Ответов: 1538
Профиль | | #7
Добавлено: 28.03.04 17:55
Если ты про автозагрузку, то кидаю тебе на