1392 / 849 / 92
Регистрация: 08.02.2017
Сообщений: 3,625
Записей в блоге: 2

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

07.10.2025, 02:21. Показов 3169. Ответов 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
1392 / 849 / 92
Регистрация: 08.02.2017
Сообщений: 3,625
Записей в блоге: 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
1392 / 849 / 92
Регистрация: 08.02.2017
Сообщений: 3,625
Записей в блоге: 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
Ответ Создать тему
Опции темы

Новые блоги и статьи
Благородство как наказание
Maks 24.04.2026
У хорошего человека отношения с женщинами всегда складываются трудно. А я человек хороший. Заявляю без тени смущения, потому что гордиться тут нечем. От хорошего человека ждут соответствующего. . .
Валидация и контроль данных табличной части документа перед записью
Maks 22.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в КА2. Задача: контроль и валидация данных табличной части документа перед записью с учетом регламента компании. . .
Отчёт о затраченных материалах за определенный период с макетом печатной формы
Maks 21.04.2026
Отчёт из решения ниже размещён в конфигурации КА2. Задача: разработка отчёта по затраченным материалам за определённый период, с возможностью вывода печатной формы отчёта с шапкой и подвалом. В. . .
Отчёт о спецтехнике находящейся в ремонте
Maks 20.04.2026
Отчёт из решения ниже размещен в конфигурации КА2. Задача: отобразить спецтехнику, которая на данный момент находится в ремонте. Есть нетиповой документ "Заявка на ремонт спецтехники" который. . .
Памятка для бота и "визитка" для читателей "Semantic Universe Layer (Слой семантической вселенной)"
Hrethgir 19.04.2026
Сгенерировано для краткого описания по случаю сборки и компиляции скелета серверного приложения. И пусть после этого скажут, что статьи сгенерированные AI - туфта и не интересно. И это не реклама -. . .
Запрет удаления строк ТЧ документа при определённом условии
Maks 19.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "Аккумуляторы", разработанного в конфигурации КА2. У данного документа есть ТЧ, в которой в зависимости от прав доступа. . .
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут Суть: - Группа наркоманов из 10 человек. - Только один инфицирован ВИЧ. - Колются одной иглой. - Колются раз в день. - Колются последовательно через. . .
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru