Форум программистов, компьютерный форум, киберфорум
Visual Basic
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
1400 / 858 / 92
Регистрация: 08.02.2017
Сообщений: 3,642
Записей в блоге: 2

С++-библиотека-фреймворк для VBxx

07.10.2025, 02:21. Показов 3272. Ответов 41
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всязи с недавно открывшейся возможностью по написанию такой библиотеки, появилась мысль по написанию такой библиотеки, хотя такая мысль была у меня давно, но не было возмжоности, а теперь есть возможность, надо бы найти мысль, надо ее вспомнить, то о чем я думал. Если перейти к конкретике, я думал, о том, чего не хватает в VB и то что это на самом деле не так сложно восполнить, зная С/С++ (или другие компилируемые языки, тот же пурик, дельфин и пр.). Чуть позже составлю примерный список из того, что можно было реализовать исходя из моего слегка ограниченного видения..

Добавлено через 11 минут
1) InStr для массивов. Итак, начнем с функции InStr. Не хватает реализации этой функции для массивов, говоря по иному, чтобы функция могла искать блок памияти в другом блоке памяти, реализовать хочу, как поиск любого массива внутри любого массива (не ссылочного ест-но)
2) RichEdit также как здесь. Это сложновато, но надеюсь на нейросеть и ее натасканность нейросетей на C++ и готовую кодовую базу по этому оконному элементу.
3) различные строковые функции из js/php/python.
4) MemCopy, GetMem*, PutMem* для VBA
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
07.10.2025, 02:21
Ответы с готовыми решениями:

Можно ли программно подключить библиотеку VBA, в частности библиотеку Microsoft Visual Basic for Application Extensebility?
Кто знает, можно ли программно подключить библиотеку VBA, в частности библиотеку Microsoft Visual...

Нужна библиотека с функциями для работы с файлами
Я разрабатываю операционную оболочку на QBasic'e - QuickGUI (quickgui.narod.ru), и сейчас нужно...

Помогите пожалуйста с Инициализацией Dll библиотеки
После компиляции проекта требуется обновить dll библиотеку без повторной компиляции проекта. Можно...

41
1400 / 858 / 92
Регистрация: 08.02.2017
Сообщений: 3,642
Записей в блоге: 2
17.11.2025, 13:48  [ТС]
Студворк — интернет-сервис помощи студентам
В VBA доступны регулярки "VBScript.RegExp", которые, однако, не работают с Ansi-строками, поэтэму решил заморочиться со враппером регулярок, доступных, на C/C++. На C нет своих регулярок, однако можно использовать перловскую библиотеку PCRE (возможно, позже, что-нибудь попробую сделать и с ней тоже). На C++ есть std::regexp, который работат с Ansi/UTF16, чего, также, вполне, достаточно для строк UTF8 во многих случаях. C++ конечно ужасает одним только видом подсказок ввода (описание аргументов во вложении просто нечто), но, тем не менее, заручившисть поддержкой нейросетей, у меня получилось получить рабочую функцию, которую пришлось не допиливать, убирая недооптимизации, (хотя я просил делать максимально оптимально). В данном примере производится поиск всех совпадений паттерна в ansi-строке с помощь std::regexp и позиции найденных подстрок выводятся в массив. Это конечно не универсально, если надо находить отдельные включенные субпаттерны (включенные в другие), то надо как-то все еще усложнять. Надо будет еще сделать функцию RegexpReplaceA().
Кликните здесь для просмотра всего текста
C++
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
#include "ATLVBA_i.h"
#include <windows.h>
#include <regex>
#include <string>
 
struct MatchPosition {
    LONG position;
    LONG length;
};
 
std::regex* CreateStdRegexA(BSTR bstrPattern){
    return new std::regex((LPSTR)bstrPattern, *((long*)bstrPattern - 1));
}
 
void DestroyStdRegex(std::regex* regex){
    delete regex; // освобождает объект, если он был выделен через new
}
 
SAFEARRAY* StdRE_ExtractPositionsA(const std::regex* rxPattern, BSTR bstrInp) {
    const char* lastChar = (const char*)bstrInp + *((long*)bstrInp - 1) - 1;
    std::cregex_iterator iter((const char*)bstrInp, lastChar, *rxPattern);
    std::cregex_iterator iter_end;
 
    LONG match_count = 0;
    for (auto i = iter; i != iter_end; ++i) {
        match_count++;
    }
    if (match_count) {} else return NULL; //возвращаем нулль, если ни чего не найдено
 
    SAFEARRAY* psaMatches = SafeArrayCreateVector(VT_UI8, 0, match_count);
    if (!psaMatches) return NULL;
 
    // Получить указатель на данные SAFEARRAY для прямой записи
    MatchPosition* matchPositions = NULL;   
    HRESULT hr = SafeArrayAccessData(psaMatches, (void**)&matchPositions);
    if (FAILED(hr)) {
        SafeArrayDestroy(psaMatches);
        return NULL;
    }
    long j = 0;
    for (auto pmatch = iter; pmatch !=iter_end; pmatch++, j++) {
        const std::cmatch& match = *pmatch;
        matchPositions[j].position = (long)match.position(0) + 1; 
        matchPositions[j].length = (long)match.length(0);
    }
    SafeArrayUnaccessData(psaMatches);
 
    return psaMatches;
}
Пример использования в VBA
Visual Basic
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
Option Explicit
 
Type MatchPosition
    position As Long
    length As Long
End Type
 
Declare Function CreateStdRegexA Lib "atlvba.dll" (ByVal pattern As String) As LongPtr
Declare Function StdRE_ExtractPositionsA Lib "atlvba.dll" (ByVal regexObj As LongPtr, ByVal bstrInput As String) As MatchPosition()
Declare Sub DestroyStdRegex Lib "atlvba.dll" (ByVal regexObj As LongPtr)
 
Sub TestRegexInterop()
    Dim sPattern$, sSource$, i&
    Dim pstdReObj As LongPtr
    Dim mpArr() As MatchPosition
 
    sPattern = "[а-я]+"
    sSource = "яблоко3343sfj;';\;груша#@@#@!!мандарин**"
    
    pstdReObj = CreateStdRegexA(sPattern)
    
    mpArr = StdRE_ExtractPositionsA(pstdReObj, sSource)
    
    DestroyStdRegex pstdReObj
 
    ' Выводим результаты поиска
    If isArrayInit(mpArr) Then
        For i = 0 To UBound(mpArr)
            With mpArr(i)
              Debug.Print Mid$(sSource, .position, .length)
            End With
        Next i
    End If
End Sub
Миниатюры
С++-библиотека-фреймворк для VBxx  
1
1400 / 858 / 92
Регистрация: 08.02.2017
Сообщений: 3,642
Записей в блоге: 2
18.11.2025, 16:14  [ТС]
Цитата Сообщение от testuser2 Посмотреть сообщение
Надо будет еще сделать функцию RegexpReplaceA()
Не стал заморачиваться, поскольку там нельзя напрямую передать строку BSTR в cpp-регуярки, обязательно надо преобразовывать в std::string и обратно, проще тогда преобразовывать в юникод, и использовать обычные VBScript.RegExp. Дальше будем поразбираться с PCRE, г-рят она крутая..
Пример использования библиотеки PCRE в VBA (с моей библиотекой)
Visual Basic
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
Option Explicit
DefLngPtr H, P
Declare PtrSafe Sub CoTaskMemFree Lib "ole32.dll" (ByVal hMem As LongPtr)
 
Public Const NullPtr As LongPtr = 0
Const PCRE_ERROR_NOMATCH& = -1
 
Private Sub Auto_Open()
    Stop
End Sub
Private Sub TestPCRE()
    Dim psError
    Dim erroffset&
    Dim ovector(31) As Long
    Dim pPcRe
    
    Dim hLib: hLib = LoadLibrary(ThisWorkbook.Path & "\pcre.dll")
    Dim pfn_pcre_compile: pfn_pcre_compile = GetProcAddress(hLib, "pcre_compile")  
    Dim pfn_pcre_exec: pfn_pcre_exec = GetProcAddress(hLib, "pcre_exec")
    Dim pfn_pcre_free: pfn_pcre_free = GetProcAddress(hLib, "pcre_free")
    
    Dim sPattern$: sPattern = toA("\b\w+\b")                '"(\d{2})-(\d{2})-(\d{4})")
    Dim sSubject$: sSubject = toA("Hello world from PCRE")  '"Дата: 25-12-2023, время: 10:30")
    
    'pcre *pcre_compile(const char *pattern, int options, const char **errptr, int *erroffset, const unsigned char *tableptr);
    'pcre *re = pcre_compile(pattern, 0, &error, &erroffset, NULL);
    CCall5 pfn_pcre_compile, pPcRe, ptrSz, _
                        ByVal sPattern, ByVal 0&, psError, erroffset, ByVal NullPtr
    If pPcRe = 0 Then
        Debug.Print "Ошибка компилляции выражения"
        Exit Sub
    End If
    
    Dim lenSubj&: lenSubj = StrLenB(sSubject)
    Dim startOffset&, options&, matchCount&
    
    While startOffset < lenSubj
        'int pcre_exec(const pcre *code, const pcre_extra *extra, const char *subject, int length, int startoffset, int options, int *ovector, int ovecsize);
        'int rc = pcre_exec(re, NULL, subject, lenSubj, startOffset, options, ovector(0), 30);
        Dim rc&: Call CCall8(pfn_pcre_exec, rc, LenB(rc), _
                           ByVal pPcRe, ByVal NullPtr, ByVal sSubject, ByVal lenSubj, ByVal startOffset, ByVal options, ovector(0), ByVal 32&)
        If rc < 0 Then
            If (rc = PCRE_ERROR_NOMATCH) Then
            Else
                Debug.Print "Ошибка выполнения!!"
                Exit Sub
            End If
        End If
        matchCount = matchCount + 1
        Dim pos&: pos = ovector(0) + 1
        Dim matchlen&: matchlen = ovector(1) - ovector(0)
        
        Debug.Print fmA(MidB$(sSubject, pos, matchlen))
        
        startOffset = ovector(1)
    Wend
    
    'pcre_free(re);
'    CCall1 pfn_pcre_free, ByVal NullPtr, 0, ByVal pPcRe 'это почему-то вызывает сбой
    CoTaskMemFree pPcRe                                  'зато работает это
End Sub
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
18.11.2025, 16:14
Помогаю со студенческими работами здесь

Классы, динамические библиотеки. VB6
Добрый вечер. Ребят, подскажите, никогда не работал с классами в Basic'е. Как работать с классами?...

Не хватает библиотеки
Всем привет. У меня вот такая проблема. Пытаюсь запустить макрос VBA, а он останавливается на...

Подключение нужных библиотек при переносе программы на другой ПК
Всем доброго здоровья! Может ли кто подсказать, как автоматизировать процесс подключения нужных...

Электронные библиотеки или кто откуда качает киниги
Предлагаю создать тему с ссылками на бесплатные электронные библиотеки с книгами по VBA и не только...

Где можно скачать библиотеку чтобы рисовать в VISIO стены, двери или окна
Здравствуйте! где можно скачать библиотеку чтобы рисовать в VISIO стены, двери или окна. И как...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
42
Ответ Создать тему
Новые блоги и статьи
[golang] Алгоритм «Хак Госпера»
alhaos 17.05.2026
Алгоритм «Хак Госпера» Хак Госпера (Gosper's Hack) — алгоритм нахождения следующего по величине числа с тем же количеством установленных бит. Придуман Биллом Госпером в 1970-х, опубликован в. . .
Рисование бинарного древа до 6-го колена на js, svg.
russiannick 17.05.2026
<svg width="335" height="240" viewBox="0 0 335 240" fill="#e5e1bb"> <style> <!]> </ style> <g id="bush"> </ g> </ svg> function fn(){ let rost;/ / высота древа let xx=165,yy=210,w=256;
FSharp: interface of module
DevAlt 16.05.2026
Интерфейс модуля F# позволяет управлять доступностью членов, содержащихся в реализации модуля. По-умолчанию все члены модуля доступны: module Foo let x = 10 let boo () = printfn "boo" . . .
Хитросплетение родственных связей пантеона греческих богов.
russiannick 14.05.2026
Однооконник, позволяющий узреть и изучить отдельных героев древней Греции. <!DOCTYPE html> <html lang="ru"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible". . .
[golang] Угол между стрелками часов
alhaos 12.05.2026
По заданным значениям часа и минуты необходимо определить значение меньшего угла между стрелками аналогового циферблата часов. import "math" func angleClock(hour int, minutes int) float64 { . . .
Debian 13: Установка Lazarus QT5
ВитГо 09.05.2026
Эта инструкция моя компиляция инструкций volvo https:/ / www. cyberforum. ru/ blogs/ 203668/ 10753. html и его же старой инструкции по установке Lazarus с gtk2. . .
Нейросеть на алгоритме "эстафета хвоста" как перспектива.
Hrethgir 06.05.2026
На десерт, когда запущу сервер. Статья тут https:/ / habr. com/ ru/ articles/ 1030914/ . Автор я сам, нейросеть только помогает в вопросах которые мне не известны - не знаю людей которые знали-бы. . .
Асинхронный приём данных из COM-порта
Argus19 01.05.2026
Асинхронный приём данных из COM-порта Купил на aliexpress термопринтер QR701. Он оказался странным. Поключил к Arduino Nano. Был очень удивлён. Наотрез отказывается печатать русские буквы. Чтобы. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru