Поиск подстроки по указателю

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
sosed213
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 206
Зарегистрирован: 13.11.2007 (Вт) 21:19
Откуда: Омск

Поиск подстроки по указателю

Сообщение sosed213 » 08.06.2020 (Пн) 21:14

Всем здравствуйте.
Существует ли способ заменить штатные функции Strings.InStr, Strings.Left, Strings.Right чтобы ускорить обработку строк? При этом исходная строка хранится в памяти, и на нее есть указатель.

От куда такая потребность:
Делаю программу для работы с wim-образами. В момент применения или захвата образа, происходит CallBack с информацией о обработки текущего файла или каталога. Таких событий столько сколько файлов в образе (несколько десятков тысяч). При работе с Wim-образом (в момент применения или захвата), есть возможность пропускать "ненужные" файлы и каталоги, установкой определенного значения в возврат функции.

Но суть в том, что бы как можно быстрее понять, обрабатываемая строка (полный путь к файлу) подходит мод "маску" исключений или нет. Исходная строка хранится в памяти, и у меня есть только указатель на неё. Вначале я считываю строку по указателю, потом сравниваю ее с "маской" исключений, (например строка заканчивающееся на ".tmp" или ".dmp" или начинающееся на "\Windows\Temp") используя штатные функции Strings.InStr или Strings.Left(Strings.LCase()) и Strings.Right(Strings.LCase()).

Сейчас это работает, но я понимаю что это не эффективно, и возможно есть способ быстрой проверки на присутствие подстроки, с использованием указателей.

Возможно где то не корректно или не точно выразился.
Не могу сказать что знаю все, но и за дурака прошу меня не считать.

The trick
Постоялец
Постоялец
 
Сообщения: 781
Зарегистрирован: 26.06.2010 (Сб) 23:08

Re: Поиск подстроки по указателю

Сообщение The trick » 08.06.2020 (Пн) 21:37

UA6527P

sosed213
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 206
Зарегистрирован: 13.11.2007 (Вт) 21:19
Откуда: Омск

Re: Поиск подстроки по указателю

Сообщение sosed213 » 09.06.2020 (Вт) 15:34

Строка (исходная для поиска) возвращаемая в CallBack имеет тип PWSTR.
Функция StrStrIW работает с типом PCWSTR (видимо PCWSTR и PWSTR одно и тоже).

Соответственно, чтобы из VB6 передать второй параметр в StrStrIW, нужно вначале преобразовать текстовую переменную (искомую) в PWSTR?
Не могу сказать что знаю все, но и за дурака прошу меня не считать.

The trick
Постоялец
Постоялец
 
Сообщения: 781
Зарегистрирован: 26.06.2010 (Сб) 23:08

Re: Поиск подстроки по указателю

Сообщение The trick » 09.06.2020 (Вт) 15:39

Просто передавай искомый параметр как StrPtr. Строки vb6 по умолчанию хранит в юникоде.
UA6527P

sosed213
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 206
Зарегистрирован: 13.11.2007 (Вт) 21:19
Откуда: Омск

Re: Поиск подстроки по указателю

Сообщение sosed213 » 09.06.2020 (Вт) 16:36

Работает!
И по средним замерам скорости, примерно в 9 раз быстрее.
Спасибо!
Не могу сказать что знаю все, но и за дурака прошу меня не считать.

sosed213
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 206
Зарегистрирован: 13.11.2007 (Вт) 21:19
Откуда: Омск

Re: Поиск подстроки по указателю

Сообщение sosed213 » 10.06.2020 (Ср) 21:08

Просматривал по порядку функции в разделе Shlwapi.h, куда направил The trick, и нашел очень полезную для меня функцию PathMatchSpecEx. Позволяет быстро определить соответствует ли путь к файлу заданной маски.
Дословный перевод: "Сопоставляет имя файла из пути с одним или несколькими шаблонами имен файлов."


Код: Выделить всё
Private Declare Function PathMatchSpecExW Lib "shlwapi.dll" ( _
                        ByVal pszFile As Long, _
                        ByVal pszSpec As Long, _
                        ByVal dwFlags As Long) As Long

Private Const PMSF_NORMAL = &H0
Private Const PMSF_MULTIPLE = &H1
Private Const PMSF_DONT_STRIP_SPACES = &H10000

Private Const S_OK = 0
Private Const S_FALSE = 1

Private Sub Form_Load()
Dim strFile As String
Dim strMask As String

strFile = "C:\Windows\System32\kernel32.dll"
strMask = "*.wim;*.txt;*.dll"

If PathMatchSpecEx(strFile, strMask) = S_OK Then
    Debug.Print "S_OK"
Else
    Debug.Print "S_FALSE"
End If

End Sub


Private Function PathMatchSpecEx(ByVal sFile As String, ByVal sExtension As String) As Long
    PathMatchSpecEx = PathMatchSpecExW(ByVal StrPtr(sFile), ByVal StrPtr(sExtension), PMSF_MULTIPLE)
End Function
Не могу сказать что знаю все, но и за дурака прошу меня не считать.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Поиск подстроки по указателю

Сообщение Хакер » 14.06.2020 (Вс) 0:20

Надо иметь в виду, что у к неё коварная логика сравнения.

Например
Код: Выделить всё
*_       *
означает то же самое, что и *_*
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

sosed213
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 206
Зарегистрирован: 13.11.2007 (Вт) 21:19
Откуда: Омск

Re: Поиск подстроки по указателю

Сообщение sosed213 » 15.06.2020 (Пн) 7:42

Спасибо. буду иметь ввиду.


P.S. Сейчас на форуме есть возможность подписаться на тему, чтобы получать уведомления по почте?
Не могу сказать что знаю все, но и за дурака прошу меня не считать.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Поиск подстроки по указателю

Сообщение Хакер » 18.06.2020 (Чт) 10:09

sosed213 писал(а):P.S. Сейчас на форуме есть возможность подписаться на тему, чтобы получать уведомления по почте?

Почта пока не работает. Буквально почтовая функциональность была практически готова к возобновлению своей работы, но из-за определённых обстоятельств пришлось прекратить работу. Надеюсь на скорое возобновление.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 41

    TopList