Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Power Basic

Страница: 1 |

 

  Вопрос: VB-Строка в PB Добавлено: 17.03.04 23:00  

Автор вопроса:  @CyRax PTR | Web-сайт: basicproduction.nm.ru/ | ICQ: 204447456 

Люди, объясните почему такой код сработал правильно.

Ведь 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

Ответить

  Ответы Всего ответов: 7  

Номер ответа: 1
Автор ответа:
 alex



Вопросов: 84
Ответов: 453
 Профиль | | #1 Добавлено: 18.03.04 18:23

VB хранит строки в UNICODE, а PB в ANSI, может из-за этого...

Ответить

Номер ответа: 2
Автор ответа:
 @CyRax PTR



ICQ: 204447456 

Вопросов: 28
Ответов: 664
 Web-сайт: basicproduction.nm.ru/
 Профиль | | #2
Добавлено: 18.03.04 23:27

Должно же быть какое то объяснение этому феномену.

Ответить

Номер ответа: 3
Автор ответа:
 cresta



Вопросов: 117
Ответов: 1538
 Профиль | | #3 Добавлено: 20.03.04 10:26

Целый месяц ковырял PB, пришед к выводу, что он ведет себя несколько непредсказуемо. То, что не должно работать - работает, а что должно - нет. Самое непонятное - некоторые конструкции сегодня работают, а завтра могут отказать безо всяких на то причин. Вот пример: была ф-ция создания и при выходе из программ - уничтожения шрифтов и кистей  (все переменные - GLOBAL)
FUNCTION CreateFonts(Flag AS LONG) AS LONG ' Создание шрифтов

    IF Flag THEN ' создаем
  '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    'уничтожаем созданные объекты
         ;DeleteObject hFont1
         ;DeleteObject hFont2
         ;DeleteObject hFont3
 ;DeleteObject hFont4
         ;DeleteObject hFont5
         ;DeleteObject hBrush
         ;DeleteObject hBrush1
         ;DeleteObject 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)
'
'
 ;DIALOG SHOW MODAL hWnd, CALL WndProc
 CreateFonts 0
END FUNCTION
 
FUNCTION CreateFonts(Flag AS LONG) AS LONG ' Создание шрифтов

    IF Flag THEN ' создаем

    ELSE    'уничтожаем созданные объекты
         ;DeleteObject hFont1
         ;DeleteObject hFont2
         ;DeleteObject hFont3
 ;DeleteObject hFont4
         ;DeleteObject hFont5
         ;DeleteObject hBrush
         ;DeleteObject hBrush1
         ;DeleteObject hBrush2
    END IF
END FUNCTION

И в таком виде работает. IMHO, PB - вещь чрезвычайно глючная и непредсказуемая.
Ещё пример - поставил программу в автозагрузку (в ключ RUN). Два дня не хотела запускаться при загрузке Windows(возникала ошибка и предлагалось отправить отчёт о ней, хотя вручную прога запускается и работает без проблем) , а затем опять же безо всяких изменений вдруг стала запускаться нормально. И таких примеров валом. Просто вспомнились самые последние. Как - это называется - непонятно. IMHO, этот язык программирования надо было назвать не PB а GB (ГлюкБейсик). Видимо это и есть причина того, что за столько лет своего существования он так и не получил сколько-нибудь значительного распространения. Какой-то недоделанный гибрид VB & C++
Так что, CyRax, думаю, что объяснение этому твоему феномену - самый банальный глюк. Что касается строк, то я тоже намучался, пока переводил то в UNICODE, то ANSI, пытаясь прописать в реестре значения. Выдавало какую-то бредятину. В конце концов при помощи волшебного слова Сим-Сим и ещё каких-то слов прописал таки строку. Причем не переводя в UNICODE, и при этом только используя как строковую переменную фиксированной длины.
Так что, если хочется скорости, нужен не РВ, а Си...

Ответить

Номер ответа: 4
Автор ответа:
 @CyRax PTR



ICQ: 204447456 

Вопросов: 28
Ответов: 664
 Web-сайт: basicproduction.nm.ru/
 Профиль | | #4
Добавлено: 28.03.04 08:17

 Не подтвердить ни опровергнуть твоё утверждение не могу, т.к. не пользуюсь PBForms напрямую - только копирую код оттуда.
 Но вполне допускаю. Форум PowerBasic.com так и кишит сообщениями типа "Ещё один глюк PBForms".

Хотя вполне вероятно что в твоём коде закралась ошибка. Когда у меня "глючит" PB, то я первым делом грешу на себя. В большинстве случаев "глюк" оказывается в моём коде. Бывают и непонятные миражи, но они исчезают также, как и возникают.

Скорее всего это связанно не с компилятором а с системой. Например поиграл в крутую игруху или запустил пару раз Vb.Net.

Из больших перегрузок бывает система не всегда выходит с блеском, а слегка потрепаной.

Ответить

Номер ответа: 5
Автор ответа:
 cresta



Вопросов: 117
Ответов: 1538
 Профиль | | #5 Добавлено: 28.03.04 14:44
Вещи которые изначально не получаются - вполне допускаю, что это мои ошибки. В этом случае стараюсь повторить то же в VB, чтобы все понять и разобраться. Но вот то, что программа работает когда захочет - это несерьёзно. Случай с автозагрузкой (см. выше) : через несколько дней нормальной работы вновь перестала запускаться программа при загрузке компа. Как можно после этого расчитывать на то, что программа, написаная тобой будет стабильно работать, как например VB-шная.

Ответить

Номер ответа: 6
Автор ответа:
 @CyRax PTR



ICQ: 204447456 

Вопросов: 28
Ответов: 664
 Web-сайт: basicproduction.nm.ru/
 Профиль | | #6
Добавлено: 28.03.04 16:31

От делать мне больше нечего...

Ну ладно, давай свой код - гляну.

Ответить

Номер ответа: 7
Автор ответа:
 cresta



Вопросов: 117
Ответов: 1538
 Профиль | | #7 Добавлено: 28.03.04 17:55
Если ты про автозагрузку, то кидаю тебе на

cyraxua@hotmail.com.

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам