Страница: 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 ' создаем Эта ф-ция работала несколько дней и затем отказала безо всяких на то причин 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 Ни сама ф-ция, ни её объявление, ни её вызов не изменились. При компиляции стала появляться ошибка при создании кистей - Relative Operator Expected и курсор становится после CreateSolidBrush перед (RGB(0,100,200)) ??? Какой может ещё здесь требоваться оператор, и почему он не требовался вчера и позавчера - непонятно
..... Обычная API. Пробовал по-всякому(вплоть до переинсталляции PB) - не заработало, пока не сделал так: перенес создание в WINMAIN, а удаление так и осталось в старой ф-ции
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
Если ты про автозагрузку, то кидаю тебе на