purebasic.info
http://purebasic.info/phpBB3ex/

Создание библиотек пользователя (UserLibraries)
http://purebasic.info/phpBB3ex/viewtopic.php?f=18&t=151
Страница 1 из 6

Автор:  kvitaliy [ Чт июл 19, 2007 8:54 am ]
Заголовок сообщения:  Создание библиотек пользователя (UserLibraries)

Краткое описание, основанное исключительно на собственном опыте с примером.
В качестве примера выбрана очень полезная функция, которую к тому же вряд ли когда напишут братья наши меньшие - ибо она умеет писать цифры прописью, по-русски, в рублях.
В связи с этим анекдот:
Цитата:
В банке клерк говорит блондинке: " Ну а теперь эту сумму денег напишите внизу прописью!"
Блондинка - :" А как это?"
Клерк - " А вы цифры словами напишите"
Блондинка -" Вы что меня за дуру считаете - цифры буквами писать?"

Не скажу, что этот алгоритм придумал я сам - просто передрал со скрипта на VBA, но работает он исправно.
Открываем редактор PureBasic ( напомню, что у меня v 4.02) и пишем следующий код:
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
 
Procedure.s StringMoney(chislo)
all.b=#False
Dim a.l(3)
a(1) = chislo / 1000000
a(2) = (chislo / 1000) - a(1) * 1000
a(3) = chislo % 1000
Stri$ = ""
For i = 1 To 3
If a(i) <> 0
    Select  a(i) / 100
    Case 1
        Stri$ = Stri$ + " сто"
    Case 2
        Stri$ = Stri$ + " двести"
    Case 3
        Stri$ = Stri$ + " триста"
    Case 4
        Stri$ = Stri$ + " четыреста"
    Case 5
        Stri$ = Stri$ + " пятьсот"
    Case 6
        Stri$ = Stri$ + " шестьсот"
    Case 7
        Stri$ = Stri$ + " семьсот"
    Case 8
        Stri$ = Stri$ + " восемьсот"
    Case 9
        Stri$ = Stri$ + " девятьсот"
    EndSelect
    Select  (a(i) / 10) % 10
    Case 1
            Select  a(i) % 10
            Case 1
                Stri$ = Stri$ + " одиннадцать"
            Case 2
                Stri$ = Stri$ + " двенадцать"
            Case 3
                Stri$ = Stri$ + " тринадцать"
            Case 4
                Stri$ = Stri$ + " четырнадцать"
            Case 5
                Stri$ = Stri$ + " пятнадцать"
            Case 6
                Stri$ = Stri$ + " шестнадцать"
            Case 7
                Stri$ = Stri$ + " семнадцать"
            Case 8
                Stri$ = Stri$ + " восемнадцать"
            Case 9
                Stri$ = Stri$ + " девятнадцать"
            Case 0
                Stri$ = Stri$ + " десять"
            EndSelect
            all = #True
    Case 2
        Stri$ = Stri$ + " двадцать"
    Case 3
        Stri$ = Stri$ + " тридцать"
    Case 4
        Stri$ = Stri$ + " сорок"
    Case 5
        Stri$ = Stri$ + " пятьдесят"
    Case 6
        Stri$ = Stri$ + " шестьдесят"
    Case 7
        Stri$ = Stri$ + " семьдесят"
    Case 8
        Stri$ = Stri$ + " восемьдесят"
    Case 9
        Stri$ = Stri$ + " девяносто"
    EndSelect
        If Not (all)
            Select  a(i) % 10
            Case 1
                If i = 2
                Stri$ = Stri$ + " одна тысяча"
                ElseIf i = 1
                Stri$ = Stri$ + " один миллион"
                Else
                Stri$ = Stri$ + " один рубль"
                all = #False
                EndIf
            Case 2
                If i = 2
                Stri$ = Stri$ + " две тысячи"
                ElseIf i = 1
                Stri$ = Stri$ + " два миллиона"
                Else
                Stri$ = Stri$ + " два рубля"
                all = #False
                EndIf
            Case 3
                Stri$ = Stri$ + " три"
                If i = 2
                Stri$ = Stri$ + " тысячи"
                ElseIf i = 1
                Stri$ = Stri$ + " миллиона"
                Else
                Stri$ = Stri$ + " рубля"
                all = #False
                EndIf
            Case 4
                Stri$ = Stri$ + " четыре"
                If i = 2
                Stri$ = Stri$ + " тысячи"
                ElseIf i = 1
                Stri$ = Stri$ + " миллиона"
                Else
                Stri$ = Stri$ + " рубля"
                all = #False
                EndIf
            Case 5
                Stri$ = Stri$ + " пять"
                all = #True
            Case 6
                Stri$ = Stri$ + " шесть"
                all = #True
            Case 7
                Stri$ = Stri$ + " семь"
                all = #True
            Case 8
                Stri$ = Stri$ + " восемь"
                all = #True
            Case 9
                Stri$ = Stri$ + " девять"
                all = #True
            Case 0
                all = #True
            EndSelect
EndIf
         If all
    Select  i
    Case 1
        Stri$ = Stri$ + " миллионов"
    Case 2
        Stri$ = Stri$ + " тысяч"
    Case 3
        Stri$ = Stri$ + " рублей"
    EndSelect
         EndIf
 EndIf
all = #False
Next
If a(3) = 0 : Stri$ = Stri$ + " рублей":EndIf
Stri$ = Trim(Stri$)
;Mid(Stri$, 1) = UCase(Left(Stri$, 1))
ProcedureReturn Stri$
EndProcedure
 
Debug StringMoney(123456)



Как видите, тут только одна функция, которая возвращает некую строковую переменную. На вход подаётся десятичное число означающее мыслимое кол-во денег, на выходе - это число прописью.
Запускаем на исполнение, убеждаемся , что работает всё как задумано. Но наша конечная цель это создание библиотеки пользователя - надо преобразовать код в соответствии
к требованием библиотек. Преобразования минимальные - Procedure.s в ProcedureDLL.s и исключаем проверку Debug StringMoney(123456).

Получилось вот что:

Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
 
 
ProcedureDLL.s StringMoney(chislo)
all.b=#False
Dim a.l(3)
a(1) = chislo / 1000000
a(2) = (chislo / 1000) - a(1) * 1000
a(3) = chislo % 1000
Stri$ = ""
For i = 1 To 3
If a(i) <> 0
    Select  a(i) / 100
    Case 1
        Stri$ = Stri$ + " сто"
    Case 2
        Stri$ = Stri$ + " двести"
    Case 3
        Stri$ = Stri$ + " триста"
    Case 4
        Stri$ = Stri$ + " четыреста"
    Case 5
        Stri$ = Stri$ + " пятьсот"
    Case 6
        Stri$ = Stri$ + " шестьсот"
    Case 7
        Stri$ = Stri$ + " семьсот"
    Case 8
        Stri$ = Stri$ + " восемьсот"
    Case 9
        Stri$ = Stri$ + " девятьсот"
    EndSelect
    Select  (a(i) / 10) % 10
    Case 1
            Select  a(i) % 10
            Case 1
                Stri$ = Stri$ + " одиннадцать"
            Case 2
                Stri$ = Stri$ + " двенадцать"
            Case 3
                Stri$ = Stri$ + " тринадцать"
            Case 4
                Stri$ = Stri$ + " четырнадцать"
            Case 5
                Stri$ = Stri$ + " пятнадцать"
            Case 6
                Stri$ = Stri$ + " шестнадцать"
            Case 7
                Stri$ = Stri$ + " семнадцать"
            Case 8
                Stri$ = Stri$ + " восемнадцать"
            Case 9
                Stri$ = Stri$ + " девятнадцать"
            Case 0
                Stri$ = Stri$ + " десять"
            EndSelect
            all = #True
    Case 2
        Stri$ = Stri$ + " двадцать"
    Case 3
        Stri$ = Stri$ + " тридцать"
    Case 4
        Stri$ = Stri$ + " сорок"
    Case 5
        Stri$ = Stri$ + " пятьдесят"
    Case 6
        Stri$ = Stri$ + " шестьдесят"
    Case 7
        Stri$ = Stri$ + " семьдесят"
    Case 8
        Stri$ = Stri$ + " восемьдесят"
    Case 9
        Stri$ = Stri$ + " девяносто"
    EndSelect
        If Not (all)
            Select  a(i) % 10
            Case 1
                If i = 2
                Stri$ = Stri$ + " одна тысяча"
                ElseIf i = 1
                Stri$ = Stri$ + " один миллион"
                Else
                Stri$ = Stri$ + " один рубль"
                all = #False
                EndIf
            Case 2
                If i = 2
                Stri$ = Stri$ + " две тысячи"
                ElseIf i = 1
                Stri$ = Stri$ + " два миллиона"
                Else
                Stri$ = Stri$ + " два рубля"
                all = #False
                EndIf
            Case 3
                Stri$ = Stri$ + " три"
                If i = 2
                Stri$ = Stri$ + " тысячи"
                ElseIf i = 1
                Stri$ = Stri$ + " миллиона"
                Else
                Stri$ = Stri$ + " рубля"
                all = #False
                EndIf
            Case 4
                Stri$ = Stri$ + " четыре"
                If i = 2
                Stri$ = Stri$ + " тысячи"
                ElseIf i = 1
                Stri$ = Stri$ + " миллиона"
                Else
                Stri$ = Stri$ + " рубля"
                all = #False
                EndIf
            Case 5
                Stri$ = Stri$ + " пять"
                all = #True
            Case 6
                Stri$ = Stri$ + " шесть"
                all = #True
            Case 7
                Stri$ = Stri$ + " семь"
                all = #True
            Case 8
                Stri$ = Stri$ + " восемь"
                all = #True
            Case 9
                Stri$ = Stri$ + " девять"
                all = #True
            Case 0
                all = #True
            EndSelect
EndIf
         If all
    Select  i
    Case 1
        Stri$ = Stri$ + " миллионов"
    Case 2
        Stri$ = Stri$ + " тысяч"
    Case 3
        Stri$ = Stri$ + " рублей"
    EndSelect
         EndIf
 EndIf
all = #False
Next
If a(3) = 0 : Stri$ = Stri$ + " рублей":EndIf
Stri$ = Trim(Stri$)
;Mid(Stri$, 1) = UCase(Left(Stri$, 1))
ProcedureReturn Stri$
EndProcedure



Сохраняем с именем LibStringMoney. На этом этапе пока всё. Проверяем, есть ли в Меню PureBasic Инструменты->TailBite? Если нет то в папке с установленным PureBasic папка TailBite?
Если папка есть, а вменю нет, то возможно установлено не правильно, лучше переустановить. Скачайте новый дистрибьютив по ссылке

http://www.purebasicpower.de/?download=TailBite_Installer.exe

Перепишите файл TailBite_Installer.exe в папку с PureBasic, и запустите на установку - ответьте на вопросы и по окончании проверьте в меню.
Далее, что бы всё было по взрослому, к нашей библиотеке нужен файл помощи. Библиотеки пишутся для людей и без помощи не обойтись.
Для винды помощь принято писать в формате chm. Способ первый - в папке с PureBasic есть папка DocMaker, там описан способ создания
правильного файла помощи из обыкновенного текстового файла. Я взял за основу английский вариант, в нужных местах написал свой текст и всё это скормил программе DocMaker.exe. Но для этого способа вам необходима программа HTMLWORKSHOP и путь к файлу hhc.exe.
Прога эта бесплатная, но надо искать и качать где то. Можно использовать для этих целей прогу htm2chm, весит мало и работает хорошо, есть русская версия. Но работает только с HTM файлами. Рекомендую. Была когда то на http://yarix.by.ru/
Будем считать, что справку сделали.
Открываем наш проект с библиотекой StringMoney и запускаем из меню Инструменты->TailBite. Файл проверяется на корректность, запрашивается имя справки, которая будет ассоциирована с нашей библиотекой. На этапе создания библиотеки сама справка не нужна, только имя, а по этому, можно просто запомнить какое имя вы указали
а потом переименовать реальную справку в соответствии.
Если ошибок на этапе создания не высветилось, то прямо не выходя из редактора создаём новый проект, и пишем в нём Debug StringMoney(123456). Обратите внимание, что если внутри скобок поставить курсор, то внизу редактора должна появиться подсказка в виде нашей функции ->StringMoney(chislo). Значит всё правильно, можно запускать.
Дальше, в папку PureBasic->Help записываем наш файл помощи и проверяем, как он работает -> выделяем нашу функцию и жмём F1. Если выскочил наш файл помощи, то всё правильно, если общий
PureBasic, то значит с именем что то не так.
Как поделиться с миром?
Открываем папку PureLibraries->UserLibraries-> ищем LibStringMoney. Переписываем в отдельную папку этот файл, файл помощи, файл с примером использования(.pb) и текстовое краткое описание, упаковываем ZIP, отправляем товарищам по цеху.

Все материалы и исходники, шаблоны для хелпа в виде htm по этому делу берём тут:

http://pbasic.spb.ru/files/up/LibStringMoney.zip

Автор:  Пётр [ Чт июл 19, 2007 11:49 am ]
Заголовок сообщения: 

Спасибо за подробное объяснение принципа создания библиотек.

Справку можно сделать и с помощью программы PureHELP Maker
http://www.purearea.net/pb/download/devtools/PureHELP.zip
Эта программа создаёт справку для готовых библиотек. Достаточно указать путь к требуемой библиотеке и заполнить все поля для каждой функции. :)

Автор:  kvitaliy [ Чт июл 19, 2007 2:25 pm ]
Заголовок сообщения: 

Да, действительно, PureHELP Maker значительно упрощает создание файла помощи, но тоже требует стороннего компилятора типа Microsoft's HTML Help Compiler (hhc.exe ).

Автор:  Пётр [ Чт июл 19, 2007 4:49 pm ]
Заголовок сообщения: 

Цитата:
требует стороннего компилятора типа Microsoft's HTML Help Compiler (hhc.exe ).

Файл hhc.exe и требуемую для его работы библиотеку hha.dll можно взять здесь http://pbasic.spb.ru/files/up/hhc.rar

Автор:  Пётр [ Чт фев 14, 2008 3:54 pm ]
Заголовок сообщения: 

Где можно найти прогу TailBite для PB 4.10?
Нужно друпию перекомпилировать, чтобы использовать для прог с включённым "безопасным потоком".

Автор:  Пётр [ Чт фев 14, 2008 4:21 pm ]
Заголовок сообщения: 

Цитата:
Где можно найти прогу TailBite для PB 4.10?

Нашёл здесь http://www.tailbite.com/

Автор:  Пётр [ Пн июл 28, 2008 7:28 pm ]
Заголовок сообщения: 

А можно как-то конвертировать динамическую библиотеку (DLL) в статическу (Lib) ?
Нашёл программу LibImporter, которая вроде как может из статических библиотек делать библиотеки функций для PB

Автор:  SofTie [ Вт июл 29, 2008 9:15 am ]
Заголовок сообщения: 

Пётр писал(а):
А можно как-то конвертировать динамическую библиотеку (DLL) в статическу (Lib) ?

Нет, используй LoadDllMemory из PBOSL

Пётр писал(а):
Нашёл программу LibImporter, которая вроде как может из статических библиотек делать библиотеки функций для PB

Мне известны два решения для этого:
1) Собственно LibImporter by fr34k, про который ты написал
2) Lib2PBImport by ts-soft (не генерит юзерлибу, только импорт-код)

Автор:  Пётр [ Ср авг 13, 2008 6:14 pm ]
Заголовок сообщения: 

Все мы знаем что PB 4.20 глючит немного! :(
Большинство появившехся в нём библиотек прекрасно работают под PB 4.10, но вот константы приходится вручную объявлять в исходнике. :(
Может есть возможность как то сделать для них файл с расширением RES, такой как в папке Residents.
Если я ничего не путаю, то в этих файлах хранится описание констант и структур.
Я смотрел его в HEX редакторе и похоже что его создать будет не очень сложно, только вот как? :?

Автор:  SofTie [ Чт авг 14, 2008 9:15 am ]
Заголовок сообщения: 

Открою страшную тайну - резиденты умеет делать Tailbite :)

Я, когда этого еще не знал, написал свою утилиту RezidentMaker
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#DQ$ = #DOUBLEQUOTE$
f.s = ProgramParameter()
res.s = InputRequester("Name of res file", "", Left(GetFilePart(f), Len(GetFilePart(f)) - Len(GetExtensionPart(f)) - 1))
p.s = #DQ$ + f + #DQ$ + " /RESIDENT " + #DQ$ + #PB_Compiler_Home + "Residents\" + res + #DQ$ + " /IGNORERESIDENT " + #DQ$ + res + #DQ$
 
OpenConsole()
ConsoleTitle ("ReZidentMaker")  
 
PrintN(p)
PrintN(Chr(13) + Chr(13))
 
Compiler = RunProgram(#PB_Compiler_Home + "\Compilers\pbcompiler", p, "", #PB_Program_Open | #PB_Program_Read)
Output$ = ""
If Compiler  
  While ProgramRunning(Compiler)
    Output$ = ReadProgramString(Compiler) + Chr(13)
    PrintN(Output$)
  Wend
  Output$ = Chr(13) + Chr(13)
  Output$ + "Exitcode: " + Str(ProgramExitCode(Compiler))
  PrintN(Output$)    
EndIf
 
PrintN("")
PrintN("Press any key to exit...")
Repeat
  KeyPressed$ = Inkey()
  If KeyPressed$ <> ""
    PrintN("Bye")
    CloseConsole()
  Else
    Delay(20)
  EndIf
Until KeyPressed$


На входе ожидает имя файла вида "yourfile.res.pb" - на выходе создастся файл вида "yourfile.res" и будет помещен в папку Residents
Остается перезапустить компилятор

Автор:  SofTie [ Чт авг 14, 2008 9:20 am ]
Заголовок сообщения: 

Пётр писал(а):
в этих файлах хранится описание констант и структур.

и интерфейсов и прототипов функций и даже макросы туда поместить можно

Пётр писал(а):
Все мы знаем что PB 4.20 глючит немного!

Много

Автор:  Пётр [ Чт авг 14, 2008 12:02 pm ]
Заголовок сообщения: 

SofTie писал(а):
Открою страшную тайну - резиденты умеет делать Tailbite
Раз решил открыть тайну, то рассказывай как он это делает, а то у меня чего-то не хочет, делает только библиотеки...

Автор:  SofTie [ Чт авг 14, 2008 7:09 pm ]
Заголовок сообщения: 

Цитата:
You can also create a resident file with TailBite: if TailBite doesn't find any procedure in the code, it'll assume that you want to create a resident file. Remember that in a resident source file there can only be constants, interfaces and structure definitions.

Автор:  Пётр [ Сб окт 25, 2008 4:59 pm ]
Заголовок сообщения: 

Может кто в курсе как использовать библиотеки из папки \SubSystems\UserLibThreadSafe\PureLibrariesгде находятся библиотеки безопасного режима?
Очень надо! :wink:
Сейчас приходится копировать в эти библиотеки в \PureLibraries\UserLibraries но сложность в том, что тогда не компилятся проги без безопасного режима.
А всё время менять библиотеки в этой папке не дело... :?

Автор:  SofTie [ Вс окт 26, 2008 12:15 pm ]
Заголовок сообщения: 

а в настройках компилятора же галочка есть "трэдсэйф"

Страница 1 из 6 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
http://www.phpbb.com/