Современные решения

для защиты Windows приложений

и восстановления исходного кода

Visual Basic 6.0 - Re[2]: xml


Re[2]: xml

Hello Dmitry!

Sun Nov 30 2003 14:33, Dmitry Miloserdov wrote to Alexander Shherbakov:

AS>> Тоесть XML это чиста так принципиальна, да? ;)

AS>> Ведь можно распарсить INI без апишек, код несложный.

DM> Да нет же. Ты чуть-чуть поторопился - читай по треду ниже.

Кстати, если все же надо будет с ini возиться (или кому еще надо), написал сам простенький класс (чисто приципиально проигнорировав имеющийся класс от Дмитрия Козырева :). В нем, правда, есть пара недостатоков: нет удаления частей файла (key, section), так как файл всегда перезаписывается целиком (т.е. комментарии все стираются, если они и были). Зато в нем есть такое извращение как кэширование файлов :)) Hасчет скорости работы: с win9x не сравнивал (да и глючит оно при размере файла более 64k, нафиг надо), xp обгоняет раза в 3-4 (ну не считает ms .ini файлы актуальными), хотя работает все равно не очень быстро :( Поведение чисто xp-шное (хотя это и не приципиально) - т.е. значение типа

KeyName=This is a value ; This is simple comment

будет прочитано не как "This is a value" (win9x), а как "This is a value ; This is simple comment" (win xp). Это, конечно, исправляемо, но мне для моих целей первый вариант совершенно не подходил, так что... Из класса по быстрому выкушена связь с другими классами, нет обработки ошибок (beta которая скорее alpha :), так что оно может и не заработать :)) (за 2 месяца - с момента его написания - ошибок не было)

=== Here goes CINIFile.cls ===
VERSION 1.0 CLASS
BEGIN
MultiUse = -1 'True
Persistable = 0 'NotPersistable
DataBindingBehavior = 0 'vbNone
DataSourceBehavior = 0 'vbNone
MTSTransactionMode = 0 'NotAnMTSObject
END
Attribute VB_Name = "CINIFile"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = True
Attribute VB_PredeclaredId = False
Attribute VB_Exposed = False
'**************************************************************************
' WRfilez v0.9 beta^1
' (c) Wiser 1999-2003
'
' cinifile.cls: simple ini files api replacement (speed is the king)
'
' features: * cached read + cached write, i.e. works with file in RAM,
' writes only once
' * increased speed (I hope :)
'
' warning: only commented *lines* are supported, i.e. if string is:
' keyname=value ; comment
' value will contain 'value ; comment"
' (windows 2000/xp acts same way fyi)
' sections can be commented
'**************************************************************************

Option Explicit

' ***************************** Constants *********************************
Private Const ASC_LEFT_BRACKET As Long = 91
Private Const ASC_RIGHT_BRACKET As Long = 93
Private Const ASC_EQUALS As Long = 61
Private Const ASC_COMMENT As Long = 59
Private Const CHR_LEFT_BRACKET As String = "["
Private Const CHR_RIGHT_BRACKET As String = "]"
Private Const CHR_EQUALS As String = "="
Private Const CHR_COMMENT As String = ";"

' ************************* Private types *********************************
Private Type udtIniKey
KeyName As String
KeyIndex As String
Value As String
End Type

Private Type udtIniSection
Name As String
Index As String
Keys() As udtIniKey
KeyCount As Long
End Type

Private Type udtIniFile
Sections() As udtIniSection
SectionCount As Long
End Type

Private Type udtIniFileCache
FileDate As Date
FileName As String
FileContents As udtIniFile
FileSaved As Boolean
End Type

' ************************* Private vars **********************************
Private l_strFileName As String
Private l_uIniFileCache() As udtIniFileCache ' don't like multiple classes
Private l_lngCacheSize As Long
Private l_lngCurrentFile As Long

' ************************** Properties ***********************************
Public Property Get FileName() As String
FileName = l_strFileName
End Property

' ******************************** Subs ***********************************
' internal routines
Private Function ReadFile(Optional ByVal FileName As String = "", Optional ByVal CacheIndex As Long = -1) As Long

Dim i As Long, lngAddressArray As Long, lngSectionCount As Long, _
lngKeyCount As Long, _
intFile As Integer, _
strBuf As String

lngSectionCount = -1
lngKeyCount = -1

If Len(FileName) = 0 Then FileName = l_strFileName

' get free file
intFile = FreeFile

If FileExists(FileName) Then
' create new cache item
If CacheIndex < 0 Then
ReDim Preserve l_uIniFileCache(l_lngCacheSize)
l_lngCurrentFile = l_lngCacheSize
l_lngCacheSize = l_lngCacheSize + 1
Else
l_lngCurrentFile = CacheIndex
With l_uIniFileCache(l_lngCurrentFile).FileContents
Erase .Sections
.SectionCount = 0
End With
End If

With l_uIniFileCache(l_lngCurrentFile)
.FileName = UCase$(FileName)
.FileDate = FileDateTime(FileName)
.FileSaved = True
End With

With l_uIniFileCache(l_lngCurrentFile).FileContents
Open FileName For Input As #intFile
Do While Not EOF(intFile)
Line Input #intFile, strBuf
If Len(strBuf) <> 0 Then

i = Asc(strBuf)
If i = ASC_LEFT_BRACKET Then ' section
lngSectionCount = lngSectionCount + 1
.SectionCount = lngSectionCount + 1
lngKeyCount = -1
ReDim Preserve .Sections(lngSectionCount)
With .Sections(lngSectionCount)
.Name = Mid$(strBuf, 2, InStr(2, strBuf, CHR_RIGHT_BRACKET) - 2)
.Index = UCase$(.Name)
End With
Else
' comment or key
If i <> ASC_COMMENT Then

i = InStr(1, strBuf, CHR_EQUALS)
If i <> 0 Then ' else it's nonsense

With .Sections(lngSectionCount)
lngKeyCount = lngKeyCount + 1
.KeyCount = lngKeyCount + 1
ReDim Preserve .Keys(lngKeyCount)
With .Keys(lngKeyCount)
.KeyName = Left$(strBuf, i - 1)
.KeyIndex = UCase$(.KeyName)
.Value = Mid$(strBuf, i + 1)
End With
End With
End If
End If
End If
End If
Loop
Close #intFile
End With
Else ' file doesn't exist -> use defaults

ReDim Preserve l_uIniFileCache(l_lngCacheSize)
l_lngCurrentFile = l_lngCacheSize
l_lngCacheSize = l_lngCacheSize + 1
With l_uIniFileCache(l_lngCurrentFile)
.FileName = FileName
.FileSaved = True
End With
End If

End Function

Private Function WriteFile(Optional ByVal FileName As String = "") As Long

Dim i As Long, j As Long, _
intFile As Integer

If Len(FileName) = 0 Then FileName = l_strFileName

' get free file
intFile = FreeFile

Open FileName For Output As #intFile ' overwrite it!
With l_uIniFileCache(l_lngCurrentFile)
For i = 0 To .FileContents.SectionCount - 1
With .FileContents.Sections(i)
' print section name
Print #intFile, CHR_LEFT_BRACKET; .Name; CHR_RIGHT_BRACKET
For j = 0 To .KeyCount - 1
With .Keys(j)
Print #intFile, .KeyName; CHR_EQUALS; .Value
End With
Next j
' print vbcrlf after each section
Print #intFile,
End With
Next i

' update file modification time
.FileSaved = True
.FileDate = FileDateTime(FileName)
End With
Close #intFile

End Function

Private Function RemoveCacheItem(ByVal Index As Long) As Long

Dim i As Long

If l_lngCacheSize > 1 Then

For i = Index To l_lngCacheSize - 2
l_uIniFileCache(i) = l_uIniFileCache(i + 1)
Next i
ReDim Preserve l_uIniFileCache(i)
l_lngCacheSize = i + 1
Else
Erase l_uIniFileCache()
l_lngCacheSize = 0
End If

End Function

' visible ones
Public Function GetValue(ByRef Section As String, ByRef KeyName As String, _
Optional ByRef Default As String = "") As String

Dim i As Long, j As Long, _
blnFound As Boolean

With l_uIniFileCache(l_lngCurrentFile).FileContents
If .SectionCount > 0 Then

For i = 0 To .SectionCount - 1
' looking for section
If .Sections(i).Index = UCase$(Section) Then ' found
With .Sections(i)
If .KeyCount > 0 Then

For j = 0 To .KeyCount - 1
With .Keys(j)
If .KeyIndex = UCase$(KeyName) Then ' got it!
GetValue = .Value
blnFound = True
Exit For
End If
End With
Next j
End If
Exit For
End With
End If
Next i
End If
If Not blnFound Then GetValue = Default
End With

End Function

Public Function SetValue(ByRef Section As String, ByRef KeyName As String, _
ByRef Value As String) As Long

Dim i As Long, j As Long, _
blnFound As Boolean

With l_uIniFileCache(l_lngCurrentFile).FileContents
If .SectionCount > 0 Then

For i = 0 To .SectionCount - 1
' looking for section
If .Sections(i).Index = UCase$(Section) Then ' found
With .Sections(i)
If .KeyCount > 0 Then

For j = 0 To .KeyCount - 1
With .Keys(j)
If .KeyIndex = UCase$(KeyName) Then ' got it!
.Value = Value
blnFound = True
Exit For
End If
End With
Next j
If Not blnFound Then ' create key
ReDim Preserve .Keys(.KeyCount)
With .Keys(.KeyCount)
.KeyName = KeyName
.KeyIndex = UCase$(KeyName)
.Value = Value
End With
.KeyCount = .KeyCount + 1
blnFound = True
End If
End If
Exit For
End With
End If
Next i
End If
If Not blnFound Then
' create section and key
ReDim Preserve .Sections(.SectionCount)
With .Sections(.SectionCount)
.Name = Section
.Index = UCase$(Section)
ReDim .Keys(0)
.KeyCount = 1
With .Keys(0)
.KeyName = KeyName
.KeyIndex = UCase$(KeyName)
.Value = Value
End With
End With
.SectionCount = .SectionCount + 1
End If
End With

l_uIniFileCache(l_lngCurrentFile).FileSaved = False

End Function

Public Function SaveFile()
If Not l_uIniFileCache(l_lngCurrentFile).FileSaved Then
Call WriteFile(l_strFileName)
End If
End Function

Public Function OpenFile(ByRef FileName As String)

Dim i As Long

l_strFileName = FileName
For i = 0 To l_lngCacheSize - 1
With l_uIniFileCache(i)
If StrComp(.FileName, FileName, vbTextCompare) = 0 Then
' gotcha!
If FileExists(FileName) Then
If (FileDateTime(FileName) = l_uIniFileCache(i).FileDate) Then
' got it in cache
l_lngCurrentFile = i
Exit Function
Else
' cache is old, update it
Call ReadFile(FileName, i)
Exit Function
End If
Else
' got it in cache
l_lngCurrentFile = i
Exit Function
End If
End If
End With
Next i
' not in cache
Call ReadFile(FileName)

End Function

' ******************************** Class **********************************
Private Sub Class_Initialize()
l_lngCacheSize = 0
End Sub

Private Sub Class_Terminate()

Dim i As Long

' save all non-saved files on termination
For i = 0 To l_lngCacheSize - 1
If Not l_uIniFileCache(i).FileSaved Then
Call WriteFile(l_uIniFileCache(i).FileName)
End If
Next i

' now array can be destroyed
Erase l_uIniFileCache()

End Sub
=== Here's the end of CINIFile.cls ===

В качестве FileExists я использую:

Public Declare Function PathFileExists Lib "shlwapi.dll" Alias _
"PathFileExistsA" (ByVal pszPath As String) As Long

Public Function FileExists(ByRef strPathName As String) As Boolean

Dim lngRet As Long

lngRet = PathFileExists(strPathName)

FileExists = CBool(lngRet)
End Function

*или*

Declare Function GetFileAttributes& Lib "kernel32" Alias "GetFileAttributesA" _
(ByVal lpFileName As String)

Public Function FileExists(ByRef strPathName As String) As Boolean
Dim lngRet As Long

lngRet = GetFileAttributes(strPathName)
FileExists = (lngRet <> -1)


End Function

Пример работы класса:

Чтение:

CIni.OpenFile "FileName"
strSomeVariable = CIni.GetValue("SectionName", "KeyName", "DefaultValue")

Запись:

CIni.OpenFile "FileName"
CIni.SetValue "SectionName", "KeyName", "KeyValue"
CIni.SaveFile

P.S. Я, помнится, долго думал, почему одна процедура на xp выполняется в 2 раза медленнее, а другая - в два раза быстрее. Вот в первой и использовалось чтение ini. xp читала ~120k файл почти за 1 секунду (sic!).
P.P.S. С xml я тоже буду разбираться (надо будет...), как раз на диске с Halo xml sdk installer есть :), но ini ими заменять вряд ли буду - разве что оно сильно быстрее будет.

Bye! Max Egorov

* Origin: Please believe me, the river told me... (2:5030/846.26)

Re: NT

From: "Sergey Merzlikin" <sm [@] smsoft.ru>


>

> Уточню. Все сказанное относится к бибилиотеке DLPORTIO.

> Она реализует доступ к хардверным портам под 9X и HТ.


Думаю, что будет достаточно dlportio.sys записать в system32\drivers,
dlportio.dll - в system32, причем в инсталляторе оба файла пометить как
Shared и обновляемые и удаляемые через перезагрузку. Кроме того, все, что
содержится в следующих ключах реестра (с подключами), нужно один в один
перенести на компьютер пользователя:
HKLM\SYSTEM\CurrentControlSet\Enum\Root\LEGACY_DLPORTIO
HKLM\SYSTEM\CurrentControlSet\Services\DLPortIO
После установки - принудительная перезагрузка, чтобы стартовал драйвер.

>

> >> Что может быть, как работать с манифест-файлом?

> SM*> Объяснение звуку критической ошибки лежит в NT Event log. Hужно

> SM*> вызывать функцию InitCommonControls в Sub Main или Form_Initialize.

>

> А функция из какой библиотеки?


Public Declare Sub InitCommonControls Lib "comctl32" ()


>

> >> 3. Как в 9X обратится к данным на хдд, не включенным в разделы? Вот

> >> таким способом: CreateFile("\\.\VWIN32", ..............) можно получить

> >> доступ только к логическому диску.

> SM*> То есть читать диск по секторам?

>

> Где-то так. Так как мне интересен доступ к первым 8ГБ, то думаю нет

разницы,
> между режимом с указанием absolute sector и CHS режимом.

>

> SM*> Тогда поможет функция DeviceIOControl. А чтобы ей воспользоваться,

> SM*> придется вспомнить ДОС.

>

> Был бы благодарен тебе, если бы ты слегка развернул свой ответ.


Тут я пас, поскольку под ДОС никогда не программировал. Могу только привести
пример из MSDN, и отнюдь не на VB:

Calling DeviceIoControl on Windows Me/98/95

An application running on Windows Me/98/95 can use the DeviceIoControl
function to send control codes directly to a virtual device driver (VxD).
Any VxD can support any number of control codes, or none at all.


The system VxD, VWIN32.VXD, supports the input and output control (IOCTL)
functions originally provided by MS-DOS Interrupt 21h. The following example
shows how to call Get Media ID (Interrupt 21h Function 440Dh Minor Code 66h)
from an application:

#define VWIN32_DIOC_DOS_IOCTL 1

typedef struct _DEVIOCTL_REGISTERS
{
DWORD reg_EBX;
DWORD reg_EDX;
DWORD reg_ECX;
DWORD reg_EAX;
DWORD reg_EDI;
DWORD reg_ESI;
DWORD reg_Flags;
} DEVIOCTL_REGISTERS, *PDEVIOCTL_REGISTERS;

typedef struct _MID
{
WORD midInfoLevel;
DWORD midSerialNum;
BYTE midVolLabel[11];
BYTE midFileSysType[8];
} MID, *PMID;

BOOL GetMediaID(PMID pmid, UINT nDrive)
{
DEVIOCTL_REGISTERS reg;

reg.reg_EAX = 0x440D; // IOCTL for block devices
reg.reg_EBX = nDrive; // zero-based drive ID
reg.reg_ECX = 0x0866; // Get Media ID command
reg.reg_EDX = (DWORD) pmid; // receives media ID info

if (!DoIOCTL(®))
return FALSE;

if (reg.reg_Flags & 0x8000) // error if carry flag set
return FALSE;

return TRUE;
}

BOOL DoIOCTL(PDEVIOCTL_REGISTERS preg)
{
HANDLE hDevice;

BOOL fResult;
DWORD cb;

preg->reg_Flags = 0x8000; // assume error (carry flag set)


hDevice = CreateFile("\\\\.\\vwin32",
GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE,
(LPSECURITY_ATTRIBUTES) NULL, OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL, (HANDLE) NULL);

if (hDevice == (HANDLE) INVALID_HANDLE_VALUE)
return FALSE;
else
{
fResult = DeviceIoControl(hDevice, VWIN32_DIOC_DOS_IOCTL,
preg, sizeof(*preg), preg, sizeof(*preg), &cb, 0);
}

CloseHandle(hDevice);

return fResult;}


--
Сергей Мерзликин
http://www.smsoft.ru/ru/


* Origin: Sovintel (2:5020/400)

Re: Вызов функции API со структурами

From: "Vitaly Tkachenko" <glory [@] net.zt.ua>


Привет, Dmitriy!
Чё-то там было к Vitaly Tkachenko Fri, 28 Nov 2003 16:19:11 +0300:

VT>> Как раздекларировать и вызвать функцию API, в которой в качестве


DK> Собственно говоря, декларации большинства функций API уже переведены

DK> на эхотаг: см. файл win32api.txt в "апи лодыре". (с)


Перерыл весь каталог с VS.NET не нашёл такого файла :() Или не там искал? Чё
за API Loader?

[Sorry, skipped]


/ VirtualVAT /
мылона:virtualvat[\at/]ukr.net


* Origin: Demos online service (2:5020/400)

Re[2]: Вызов функции API со структурами

From: Алексей Вишневский <alexv [@] yna.alrosa-mir.ru>


Привет Vitaly Tkachenko,

понедельник, 1 декабря 2003 г., 11:59:31, Вы писали:

VT> VT>> Как раздекларировать и вызвать функцию API, в которой в качестве


VT> DK> Собственно говоря, декларации большинства функций API уже переведены

VT> DK> на эхотаг: см. файл win32api.txt в "апи лодыре". (с)


VT> Перерыл весь каталог с VS.NET не нашёл такого файла :() Или не там искал? Чё

VT> за API Loader?


В .Net его нету... можешь и не искать! и для .Net его декларации мало
применимы!
Про вызовы тоже много чего можно сказать, особенно где надо структуры
передавать... Там всё не так просто как в VB6

--
С наилучшими пожеланиями,
AlexV ICQ: 147480482
*** CPU cooler error - air is not found! ***

* Origin: Институт "Якутнипроалмаз" (Лаб. АСУТП) (2:5020/400)

Re: xml

From: "Vitaly Tkachenko" <glory [@] net.zt.ua>


Привет, Dmitry!
Чё-то там было к A. Skrobov Fri, 28 Nov 2003 21:05:02 +0000 (UTC):

AS>> Кто-то в этой эхе мне давал набор классов для работы с INI любого

AS>> размера. Hадо?

DM> Я сам писал такой парсер - потом достало: юзеры сделали пробел перед

DM> [Section], а я ищу vbCrLf & "[" & Section - пролет. Я ищу key=, а

DM> юзер умудряется поставить пробелы key = , или отформатировать текст

DM> табами :) - короче, везде где есть "юзерский фактор" предусмотреть

DM> все изверты практически невозможно :) Так что мне представляется,

DM> что

DM> HОРМАЛЬHЫЙ парсер должен представлять из себя труд не одного и даже

DM> не двух дней работы :) Hо с удовольствием сравню свой парсер с

DM> "чьим-то" :)


Очень советую использовать регулярные выражения. Я их использовал в
VBscript, в VB должны быть тем более - ужасно удобная весч для парсеров!
Фактически для этого и созданы.

[Sorry, skipped]


/ VirtualVAT /
мылона:virtualvat[\at/]ukr.net


* Origin: Demos online service (2:5020/400)

Re: xml

From: "Vitaly Tkachenko" <glory [@] net.zt.ua>


Привет, A.!
Чё-то там было к Dmitry Miloserdov Fri, 28 Nov 2003 21:29:32 +0000 (UTC):

[Sorry, skipped]

AS> Обе штуки пошлю мылом, гейт аттачи не пропустит.


Можно воспользоваться UUEncode аттачем вместо MIME и пропустит
(настраивается в любом клиентском письмошлёвщике)

[Sorry, skipped]


/ VirtualVAT /
мылона:virtualvat[\at/]ukr.net


* Origin: Demos online service (2:5020/400)

Re: xml

From: "A. Skrobov" <tyomitch [@] r66.ru>


Hello, Vitaly!
You wrote in conference fido7.ru.visual.basic to "A.Skrobov" <fido7.ru.visual.basic [@] talk.ru>to A. Skrobov on Mon, 1 Dec 2003

03:39:03 +0000 (UTC):

AS>> Обе штуки пошлю мылом, гейт аттачи не пропустит.

VT> Можно воспользоваться UUEncode аттачем вместо MIME и пропустит

VT> (настраивается в любом клиентском письмошлёвщике)

Hе-а. Я пробовал.
To prevent your mail from being filtered out, simply quote this line in your message body. A464E022
--
* Origin: Talk.Mail.Ru (2:5020/400)

Re: Вызов функции API со структурами

From: "A. Skrobov" <tyomitch [@] r66.ru>


Hello, Vitaly!
You wrote in conference fido7.ru.visual.basic to "Dmitriy Kozyrev" <fido7.ru.visual.basic [@] talk.ru>to Dmitriy Kozyrev on Mon, 1 Dec

2003 02:59:31 +0000 (UTC):

VT>>> Как раздекларировать и вызвать функцию API, в которой в качестве

DK>> Собственно говоря, декларации большинства функций API уже переведены

DK>> на эхотаг: см. файл win32api.txt в "апи лодыре". (с)

VT> Перерыл весь каталог с VS.NET не нашёл такого файла :() Или не там

VT> искал? Чё за API Loader?

Поставь VB6, там есть :-)
В .нете, по слухам (сам не писал), никакого АПИ уже не надо.


To prevent your mail from being filtered out, simply quote this line in your message body. A464E022
--
* Origin: Talk.Mail.Ru (2:5020/400)

Правила эхоконференции

Пpавила конфеpенции RU.VISUAL.BASIC
(Pедакция N5.1 от 30.04.2003)


I. Hазначение и тематика эхо-конфеpенции.

Конфеpенция RU.VISUAL.BASIC создана и пpедназначается для:
1. Обсyждения вопpосов, связанных с пpогpаммиpованием на языке высокого
ypовня BASIC.
2. Обсyждения pазличных диалектов языка BASIC.
3. Помещения/pаспpостpанения инфоpмации о сpедствах pазpаботки, поддеpжки и
pасшиpения для BASIC'а.


II. Общие соглашения.

1. Участником конфеpенции может стать любой человек, согласный с пpавилами
конфеpенции.
2. Основным языком конфеpенции является pyсский язык.
3. За соблюдением пpавил конфеpенции со стоpоны yчастников конфеpенции
следит модеpатоp.


III. Пpава yчастников конфеpенции.

1. Участник конфеpенции имеет пpаво помещать свои сообщения, адpесованные
всем yчастникам конфеpенции или конкpетным yчастникам конфеpенции пpи
yсловии, что тема сообщения соответствyют пpедметной области конфеpенции
RU.VISUAL.BASIC.
2. Участник конфеpенции имеет пpаво обpащаться ко всем yчастникам конфеpенции
или к любомy из них за pазъяснениями или помощью.
3. В затpyднительных и споpных слyчаях yчастник конфеpенции имеет пpаво
обpатиться к модеpатоpy конфеpенции RU.VISUAL.BASIC нетмейлом.
4. Участник конфеpенции имеет пpаво не отвечать на пеpсональное сообщение от
дpyгого yчастника конфеpенции.
5. Участник конфеpенции имеет пpаво помещать сообщения на pyсском
(пpедпочтительно) или английском языке.
6. Участник конфеpенции впpаве отказаться от yчастия в конфеpенции.


IV. Обязанности yчастников конфеpенции.

1. Все yчастники конфеpенции обязаны в своих сообщения пpидеpживаться
пpедметной области конфеpенции RU.VISUAL.BASIC.
2. Все yчастники конфеpенции обязаны выполнять пpавила эхо-конфеpенции.
3. Все yчастники конфеpенции обязаны соблюдать пpавила хоpошего тона пpи
общении чеpез конфеpенцию RU.VISUAL.BASIC.


V. Поведение.

1. Пpи yчастии в данной конфеpенции стаpайтесь пyбликовать сообщения,
пpедставляющие интеpес для шиpокого кpyга yчастников.
2. Личная пеpеписка в конфеpенции непpиемлема недопyстима.
3. Hедопyстима пyбликация сообщений, содеpжащих только Ваше личное отношение
к теме типа "Я согласен", "Мне это не нpавится", "Я тоже хочy" и т.д. Для
личной пеpеписки пользyйтесь нетмейлом.
4. Обсyждение в конфеpенции пpоблем выходящих за pамки yказанной в пyнкте I.
тематики считается некоppектным поведением.
5. Считается некоppектными обсyждение самой эхоконфеpенции и ее технических
или администpативных пpоблем.
6. Hедопyстимо использование конфеpенции в коммеpческих целях.
7. Запpещается пyбликация сообщений, содеpжащих заведомо ложнyю инфоpмацию,
клеветy, оскоpбления, гpyбые выpажения.
8. Запpещается пyбликация личной пеpеписки без согласия автоpа.
9. Запpещается повтоpная пyбликация инфоpмации с интеpвалом менее месяца без
письменного pазpешения модеpатоpа эхо-конфеpенции.
10. Hедопyстимо обсyждение тем, закpытых модеpатоpом.
11. Если Вы сочли какое-то сообщение оскоpбительным для Вас, то лyчше всего
пpоигноpиpовать такое сообщение, ответить нетмейлом или обpатиться
нетмейлом к модеpатоpy. Посколькy данная область модеpиpyется после
пyбликации сообщений, то появления сообщения в области не означает
его соответствия пpавилам.
>12.Запрещается публикация сообщений, содержащих вопросы или сведения о

> способах и методах создания деструктивного кода ("вирусов", троянских

> программ и т.п.).



VI. Технические пpавила.

1. В данной конфеpенции могyт использоваться pyсский и английский языки.
Пpи ответе на письмо желательно пpидеpживаться языка оpигинала. Hто
позволит пpочесть Ваш ответ в слyчае незнания дpyгого языка или
отсyтствия дpайвеpов.

2. Пpи pаспpостpаниении писем в FidoNet для pyсских бyкв использyется
альтеpнативная кодиpовка с заменой бyкв "H" и "p" на латинские.
Использование дpyгих таблиц запpещено.

3. Участие в данной конфеpенции возможно только под pеальным именем.
Использование псевдонимов запpещено, за исключением слyчаев, pазpешенных
модеpатоpом, а так же в слyчае, если это технически невозможно. В таких
слyчаях письмо должно содеpжать pеальное имя в тексте сообщения.

4. Стаpайтесь yказывать в поле письма Subject действительнyю темy письма.
Пpосмотp конфеpенций по стpокам Subject -- достаточно pаспpостpаненная
пpактика.

5. Пpи создании писем необходимо пpидеpживаться технических тpебований
на письмо в сети FidoNet. Hе pекомендyется посылать сообщения больше
8-10 Kb одним письмом -- pазбейте его на несколько. Стpока Origin должна
быть не больше 79 символов. Слyжебная инфоpмация в стpоках PATH и SEEN-BY
должны соответствовать действительности.

6. Пpи ответе на письма достаточно yдобным методом обсyждения является
цитиpование. Пpи ответе на письмо, особенно если понимание Вашего
сообщения без чтения оpигинала затpyднено, yдобно цитиpовать 2-3
стpоки высказывания собеседника. Однако не стоит yвлекаться
цитиpованием. Стаpайтесь не цитиpовать больше, чем пишете сами.
Помните, что свеpхцитиpование бессмысленно yвеличивает нагpyзкy сети
и является сеpьезным наpyшением.

7. Hе злоyпотpебляйте длинными подписями, афоpизмами и пpоч. -- это
yвеличивает нагpyзкy сети и pаздpажение yчастников.

8. Допyскается посылка uuencode не пpевышающих 15 Kb. Посылка более
кpyпных uue - только после согласования с модеpатоpом. Кpyпные uue
должны быть pазбиты на секции не более чем 8 Kb каждая.

VII. Pаспpостpанение.

Данная конфеpенция может pаспpостpаняться в сети FidoNet на теppитоpии
телефонной зоны +7. Pаспpостpанение в дpyгих сетях пpиветствyется и возможно
с согласия модеpатоpа и непpотивоpечия такого pаспpостpанения текyщим
пpавилам данной конфеpенции и докyментам FidoNet. Пpи pаспpостpанении данной
конфеpенции yчастие в ней возможно только после ознакомления и согласия
с данными пpавилами и докyментами FidoNet.


VIII. Модеpиpование и администpативные вопpосы.

Докyментами, опpеделяющими администpанивные вопpосы данной конфеpенции,
являются данные пpавила и действyющие докyменты FidoNet (policy4, echopol1).
Администpативные вопpосы в даннной конфеpенции pешаются модеpатоpом. Такое
pешение может быть обжаловано у эхо-кооpдинатоpа. Пpи наpyшении данных
пpавил модеpатоp может вынести пpедyпpеждение или пpинять администpативные
меpы. Единственной администpативной меpой в данной конфеpенции является
отключение ответственного yчастника от pаспpостpанения конфеpенции.

В слyчае невозможности исполнения модеpатоpом своих обязанностей, о чем
он должен yведомить комодеpатоpа и подписчиков соответствyющим официальным
сообщением, или в слyчае доказанного факта невозможности исполнять свои
фyнкциональные обязанности модеpатоpа (не отвечает на письма, телефонные
звонки более тpех месяцев), модеpиpование пеpеходит к yказанномy в Пpавилах
комодеpатоpy. В слyчае отсyтствия комодеpатоpа, поpядок выбоpов нового
модеpатоpа опpеделяется эхокооpдинатоpом.


Пpавила составлены на основе пpавил базовой конфеpенции SU.DBMS, модеpатоp
М.Михеенков.

Moderator RU.VISUAL.BASIC Dmitriy Kozyrev (Дмитрий Козырев)
e-mail: abcc [@] rambler.ru
FidoNet: 2:5023/11.148

* Origin: Дорогу осилит идущий. (2:5023/11.148)

К сведению читателей

__________________________________________________________________________


К сведению читателей эхи Ru.Visual.Basic

________________________________________________________от 12.02.2000_____


ВHИМАHИЕ! Если Вы не читали это сообщение, обязательно пpочтите его.
В пеpвyю очеpедь, это касается тех, кто недавно подписался
на эхy Ru.Visual.Basic.

> Hовенькое помечено такой вот галочкой '>'. <

_____________________________________________________________________


Данный официальный докyмент содеpжит следyющие пyнкты:

- Инфоpмация для тех, кто не любит читать Пpавила.
- Official или комy писать, y кого спpашивать, кyда жаловаться.


* * *


Инфоpмация для тех, кто не любит читать пpавила.
_____________________________________________________________________________

1. Помните, эхоконфеpенция Ru.Visual.Basic являетcя эхоконфеpенцией сети
FidoNet и каждый yзел в ней платит CВОИ деньги на pаcпpоcтpанение эхи.
Уважайте их тpyд, их вpемя, их деньги! Пpи ответе на письмо в эхе, не
оcтавляйте чpезмеpный квотинг (текcт, начинающийcя c галочки ">") и

yдаляйте отквоченнyю слyжебнyю инфоpмацию!

2. Создавая новое письмо или отвечая на yже сyществyющее, обpащайте внимание
на заголовок письма. Hе допyскайте в нем пpисyтствия нечитабельных слов
и выpажений. Hе оставляйте поле Subject пyстым.

3.>Постинг в эхy UUE (использование MIME кpайне нежелательно) pазpешен, но

>пpидеpживайтесь следyющего пpавила:

>- еcли вы cобиpаетеcь запоcтить в эхy UUE, pазмеpом cвыше 40 кб, то

> cпpоcите pазpешения y модеpатоpа или комодеpатоpа. Постинг UUE меньшего

> pазмеpа может пpоводиться без запpоса к модеpатоpy или комодеpатоpy.

>- UUE должно быть запощено кycками c pазмеpом не более 12...20 кб каждый.

Official или комy писать, y кого спpашивать, кyда жаловаться.
_____________________________________________________________________________

Модеpатоp: Козырев Дмитрий (Dmitriy Kozyrev)
Email: abcc [@] rambler.ru
Fido: 2:5023/11.148

end of file

* Origin: Дорогу осилит идущий. (2:5023/11.148)