Форум программистов, компьютерный форум, киберфорум
Visual Basic
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
1386 / 842 / 91
Регистрация: 08.02.2017
Сообщений: 3,585
Записей в блоге: 1

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

07.10.2025, 02:21. Показов 2906. Ответов 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
1386 / 842 / 91
Регистрация: 08.02.2017
Сообщений: 3,585
Записей в блоге: 1
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
1386 / 842 / 91
Регистрация: 08.02.2017
Сообщений: 3,585
Записей в блоге: 1
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
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru