Форум программистов, компьютерный форум, киберфорум
Visual Basic
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.95/19: Рейтинг темы: голосов - 19, средняя оценка - 4.95
1402 / 860 / 93
Регистрация: 08.02.2017
Сообщений: 3,671
Записей в блоге: 2

Многопоточность в VBA

01.07.2023, 15:39. Показов 7481. Ответов 102

Студворк — интернет-сервис помощи студентам
Почему VBA? Про VB в принципе уже все давно расписано и исследовано за десятки лет. На VBA тема менее популярна, по в принципе понятным причинам, по скольку, там она не сильно так уж и нужна. Мне также в ней нет особой необходимости, просто некоторый интерес прощупать эту тему с точки зрения "простого обывателя", на сколько далеко можно зайти и т.д.
Вообще, говоря, на VBA есть довольно простая и удобная не очень изящная возможность организовать "потоки" за счет запуска нескольких копий приложения, также можно делать на VBS.
Далее простой пример (в файле), назовем "Игра - Останови колобка если сможешь!" ). В примере все не очень оптимально, и нет какого-то полезного шаблона, но как мне кажется хорошо видно работу т.н. маршаллинга, его усточивую работу, даже при не очень, как бы правильной ситации. При запуске множества экземпляров Экселя и их одновременному обращению к одному и тому же объекту, все продолжает работать довольно устойчиво при том, что объектная модель отдельного Экселя "общается" со всеми в одном потоке или точнее из одного потока. Видимо маршаллинг все разруливает.
В данном примере, не мало важно, что рабоает пропуск ошибок и doevents. Если попытаться реализовать подобное с помощью win-api то с этим уже появляются некоторые проблеммки.. и бог весть еще с чем, а вот при работе разных экземпляров Эксель все очень просто.
Вложения
Тип файла: zip Колобок.zip (20.7 Кб, 32 просмотров)
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
01.07.2023, 15:39
Ответы с готовыми решениями:

VBA → SSMS → VBA. Вызов хранимой процедуры SSMS из VBA с возвратом 2ух и более параметров
Приветствую! Учусь наполнять таблицу SQL из таблицы Excel. Беру таблицу в массив и построчно вызываю хранимку с передачей очередного...

Программа в VBA для проверки гипотез про равенство средних - VBA
В своё время прогулял лекции по VBA, а теперь жалею! Кто может помочь с написанием проги по проверке гипотез про равенство средних?

VBA и Oracle: stored procedure из VBA и сохранение текста в переменной
Добрый день, Кто-нибудь сталкивался с проблемой выполнения функции Oracle, т.н. Oracle stored procedure, и сохранением результата в...

102
Вернулся
 Аватар для HackerVlad
1748 / 644 / 45
Регистрация: 10.09.2021
Сообщений: 2,786
06.07.2023, 13:42
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от testuser2 Посмотреть сообщение
Создал расширяемую память в одном Экслеле, в другом подкючился к ней
Я вот например не умею расшарить память одного процесса для другого, для меня это было бы весело, а не скучно, как ты говоришь
0
1402 / 860 / 93
Регистрация: 08.02.2017
Сообщений: 3,671
Записей в блоге: 2
06.07.2023, 13:50  [ТС]
HackerVlad, я сначала смотрел у Трика, но ни фига не понял, но взял у него функцию расшаривания памяти, и нашел более простой пример по этой функции. Одной функцией разшариваешь, на одной стороне, на другой стороне подключаешься к этой "шаре" по текстовому имени. Это получается вроде бы как зарезервированное место файла подкачки, отображенное в оперативную память. Потом выложу.
0
Модератор
10060 / 3905 / 885
Регистрация: 22.02.2013
Сообщений: 5,854
Записей в блоге: 79
06.07.2023, 13:58
Будут сложности при межпроцессном взаимодействии.
В пределах процесса у потоков общее адресное пространство и у потоков есть доступ ко всем переменным. Процессы изолированы и переменные в отдельных адресных пространствах. Это создает дополнительные сложности и увеличивает накладные расходы обмена данными.
Это как раз так работают STA-компоненты, этим обеспечивается межпоточная изоляция данных и сводит ошибки синхронизации на нет. В вб6 к примеру в рамках одного процесса при Apartment-threading модели переменные и данные изолируются даже в рамках одного процесса через TLS. Накладные расходы для обмена данными - это вообще капля в море многопоточного программирования, где существует куча других проблем которые решаются межпоточной изоляцией данных. Более того если какой-то и существует критический момент в реальном алгоритме с обменом данных, то это решается расшариванием памяти и все работает точно также. Такие потоковые модели как раз для этого и создавались чтобы уменьшить количество ошибок при работе с многопоточностью.
1
1402 / 860 / 93
Регистрация: 08.02.2017
Сообщений: 3,671
Записей в блоге: 2
06.07.2023, 18:28  [ТС]
Вообще, было бы круто, если бы vba запускался отдельно от софта. На Autocad он сейчас отдельно устанавливается, на wps офис раньше поставлялся в виде установочного пакета. Надо будет глянуть как он там прикручен.
0
Эксперт по электронике
6998 / 3314 / 341
Регистрация: 28.10.2011
Сообщений: 13,020
Записей в блоге: 7
06.07.2023, 19:54
Цитата Сообщение от testuser2 Посмотреть сообщение
Вообще, было бы круто, если бы vba запускался отдельно от софта.
Для этого есть VBS.
0
Модератор
10060 / 3905 / 885
Регистрация: 22.02.2013
Сообщений: 5,854
Записей в блоге: 79
06.07.2023, 20:02
Цитата Сообщение от testuser2 Посмотреть сообщение
если бы vba запускался отдельно от софта
Ну вб6.
0
1402 / 860 / 93
Регистрация: 08.02.2017
Сообщений: 3,671
Записей в блоге: 2
07.07.2023, 10:00  [ТС]
Цитата Сообщение от testuser2 Посмотреть сообщение
Вообще, было бы круто, если бы vba запускался отдельно от софта
Это был плод воспаленного вечернего сознания..
Цитата Сообщение от locm Посмотреть сообщение
Для этого есть VBS.
На VBS когда-то сочинял "многопоточку" )
"Возвращаясь к нашим баранам".. Также ранее заметил один примечательный момент, что один поток всеже работает довольно утойчиво (при условиях, описанных в #39). Стоит запустить второй - все уже становится хрупко.
Например в одном потоке можно сделать вывод в ячейку текущего времени каждую секунду. При этом можно что-либо делать на листе, выделять, редактировть. Либо процедуру Майкла (см #35) поставить в цикл и она также будет прекрасно отрабатывать (не смотря на то, что там многочисленные рекурсии), и далее поток можно корректно завершить.
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Sub Thread0(ByVal unuse As Long)
    Dim cell As Range
    CoInitialize ByVal 0&
    On Error Resume Next
    'отмаршалленая ссылка на ячейку
    Set cell = GetObject(ThisWorkbook.FullName).Sheets(2).Range("L2")    
    Do While flag0
        'MikleTest
        cell.Value = Time
        Sleep 1000&
    Loop
    Set cell = Nothing
    If Err.Number Then Debug.Print Err.Description
    CoUninitialize
    Sleep 1000000
End Sub
И это в принципе можно использовать, допустим в запущенном потоке выполнять какую-то работу, а в основном выводить статус выполнения, или наоборот.

Добавлено через 4 часа 45 минут
Цитата Сообщение от HackerVlad Посмотреть сообщение
Я вот например не умею расшарить память
В общем я из одного открытого документа (Excelя) передавал строку в другой док. (Excel). В чем суть, создается шаренная память, в первые 4 байта (long) записывается длина строки, дальше записывается "буфер" строки. Позже я разобрался, что данные о длине строки хранятся в самой строке - первые 4 байта, но макрос не переделывал. В другом Экселе открывается эта шара и прочитываются из нее длина и строка по этой длине. Там есть еще фишка, что первые 4 байта, я не копирую, а создаю указтель на них в переменную или как правильней, может быть меняю указатель переменной на эти 4 байта х.з. В общем получается общая переменная в двух прогах. Меняешь ее в одной проге, она меняетс в другой. Но отладчик в другой проге сразу не отображает изменения, но стоит немного пошевелить размеры окон, и инфа обновляется на более актуальную.
Отправной модуль (где создается шара)
Кликните здесь для просмотра всего текста
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
62
63
64
65
66
67
68
'Модуль SendOut.bas
Public Declare Function OpenFileMapping Lib "kernel32" Alias "OpenFileMappingA" (ByVal dwDesiredAccess As Integer, ByVal bInheritHandle As Integer, ByVal lpName As String) As Long
Public Declare Function CreateFileMapping Lib "kernel32" Alias "CreateFileMappingA" (ByVal hFile As Long, ByVal lpAttributes As Long, ByVal flProtect As Integer, ByVal dwMaximumSizeHigh As Integer, ByVal dwMaximumSizeLow As Integer, ByVal lpName As String) As Long
Public Declare Function MapViewOfFile Lib "kernel32" (ByVal hFileMappingObject As Long, ByVal dwDesiredAccess As Long, ByVal dwFileOffsetHigh As Long, ByVal dwFileOffsetLow As Long, ByVal dwNumberOfBytesToMap As Long) As Long
Public Declare Function UnmapViewOfFile Lib "kernel32" (ByVal lpBaseAddress As Long) As Long
Public Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
Public Declare Function GetMem4 Lib "msvbvm60" (src As Any, Dst As Any) As Long
Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
 
Public Const FILE_MAP_ALL_ACCESS = &H1F
Public Const PAGE_READWRITE = &H4
 
Public hMMF As Long, pMemfile As Long
 
Sub testOut()
    Dim VarOut As myType, ln&, integ(9) As Integer, bt(10) As Byte
    Dim sOut As String ' * 10    
 
    sOut = "fasasfaff"
    SendString sOut
    
End Sub
 
Sub SendString(myString$, Optional flSize& = 1000, Optional ln As Long, Optional ByVal nu As Long)
    Dim intArr%(), ineg%
    
    hMMF = OpenFileMapping(FILE_MAP_ALL_ACCESS, False, "MyMMF")
    If hMMF = 0 Then
        'создание MMF
'        hMMF = CreateFileMapping(-1, 0, PAGE_READWRITE, 0, LenB(myString) + 4, "MyMMF")
        hMMF = CreateFileMapping(-1, 0, PAGE_READWRITE, 0, flSize, "MyMMF")
        'получение начального адреса MMF
        pMemfile = MapViewOfFile(hMMF, FILE_MAP_ALL_ACCESS, 0, 0, 0)
        ThisWorkbook.Sheets(1).Cells(1, 1) = hMMF
        ThisWorkbook.Sheets(1).Cells(2, 1) = pMemfile
    End If
    If pMemfile Then
        'Получение указателя на первые 4 бита расшаренной памяти '!!
        GetMem4 pMemfile, ByVal VarPtr(nu) - 4
'        Stop 
        ln = Len(myString)
        ReDim intArr(ln - 1)
'        CopyMemory ByVal pMemfile, ln, 4
        CopyMemory ByVal pMemfile + 4, ByVal StrPtr(myString), ln * 2 'LenB(myString)
    Else
        MsgBox "Ошибка маппинга файла!"
        CloseHandleSub
        Exit Sub
    End If
    Debug.Print "Отправка на: "; pMemfile
    Stop
    ln = 0
End Sub
 
'Закрытие шаренной памяти
Sub CloseHandleSub()
    If hMMF = 0 Then
        hMMF = ThisWorkbook.Sheets(1).Cells(1, 1)
        pMemfile = ThisWorkbook.Sheets(1).Cells(2, 1)
    End If
    If hMMF Then
        Debug.Print UnmapViewOfFile(pMemfile)
        Debug.Print CloseHandle(hMMF)
        hMMF = 0
        pMemfile = 0
        ThisWorkbook.Sheets(1).Range("A1:A2").Clear
    End If
End Sub

Принимающий модуль
Кликните здесь для просмотра всего текста
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
'Модуль SendIn.bas
'Все те же декларации и константы
 
Sub testIn()
    Dim VarIn As myType, sIn$
    
    AcceptString sIn
    
    Debug.Print "Принята строка: "; sIn
End Sub
 
Sub AcceptString(myString As String, Optional ln As Long, Optional ByVal nu As Long)
    Dim pMemfile&, hMMF&, i&, t!
    'получение хендла 
    hMMF = OpenFileMapping(FILE_MAP_ALL_ACCESS, False, "MyMMF")
    
    If hMMF Then
        'получение начального адреса
        pMemfile = MapViewOfFile(hMMF, FILE_MAP_ALL_ACCESS, 0, 0, 0)
        GetMem4 pMemfile, ByVal VarPtr(nu) - 4
        'Stop 'получение указателя !!
        myString = Space(ln)
        'Получение строки из расшаренной памяти
        CopyMemory ByVal StrPtr(myString), ByVal pMemfile + 4, ln * 2
        Debug.Print "Принято на: "; pMemfile
    Else
        MsgBox "Отсутсвтует файл!"
    End If
    
    Stop
    ln = 1
    'отключение от расшаренной памяти
    UnmapViewOfFile pMemfile
    CloseHandle hMMF
End Sub
1
Вернулся
 Аватар для HackerVlad
1748 / 644 / 45
Регистрация: 10.09.2021
Сообщений: 2,786
07.07.2023, 10:38
testuser2, молодец! только жаль для VB6 примера нет...
0
1402 / 860 / 93
Регистрация: 08.02.2017
Сообщений: 3,671
Записей в блоге: 2
07.07.2023, 11:11  [ТС]
HackerVlad, закомментируй строки с ThisWorkbook.. и будет вариант для VB6
0
1402 / 860 / 93
Регистрация: 08.02.2017
Сообщений: 3,671
Записей в блоге: 2
08.07.2023, 02:53  [ТС]
Цитата Сообщение от testuser2 Посмотреть сообщение
что один поток всеже работает довольно утойчиво
Черт возьми, это тоже плохой вариант! Стоит создть нагрузку в двух потоках и карточный домик рушится. Против науки не попрешь, как говориться..
0
Вернулся
 Аватар для HackerVlad
1748 / 644 / 45
Регистрация: 10.09.2021
Сообщений: 2,786
08.07.2023, 10:08
Да успокойся с этими потоками ты уже) это не для VBA явно)
0
1402 / 860 / 93
Регистрация: 08.02.2017
Сообщений: 3,671
Записей в блоге: 2
08.07.2023, 10:19  [ТС]
Я не успокоюсь пока мне не скажут, такой вариант можно реализовать? Если связующий класс реализовать в библиотеке
0
Вернулся
 Аватар для HackerVlad
1748 / 644 / 45
Регистрация: 10.09.2021
Сообщений: 2,786
08.07.2023, 11:13
testuser2, там что-то такое интересное ажно за 1997 год)))

Добавлено через 47 минут
так это что статья Дан Эплмана? Тот который впервые писал о многопоточности в VB?

Добавлено через 1 минуту
Я читал его книгу бумажную, пытался что-то делать тогда, ещё лет 20 назад, по многопоточности, но у меня так ничего и не получалось. У The Trick'а всё гораздо лучше описано.

Добавлено через 1 минуту
Хотя если честно я многопоточность до сих пор так и не освоил. Надо этим плотно заниматься, читать статьи The Trick'а и смотреть его примеры. У Дана Эплмана будет в любом случае глючная ерунда.

Добавлено через 1 минуту
Даже проект который скачал уже глючит! Постоянный вылет из среды VB6. У The Trick'а ничего не глючит.
0
1402 / 860 / 93
Регистрация: 08.02.2017
Сообщений: 3,671
Записей в блоге: 2
08.07.2023, 11:28  [ТС]
В общем клас создал как в статье, ActiveX-библиотеку скомпилировал в p-code, нашел CLSID класса в реестре. Вопрос куда его прописать в процедуре InitializeIID
Кликните здесь для просмотра всего текста
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
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
Option Explicit
 
Declare Function CreateThread Lib "kernel32" (ByVal lpSecurityAttributes As Long, ByVal dwStackSize As Long, ByVal lpStartAddress As Long, ByVal lpParameter As Long, ByVal dwCreationFlags As Long, lpThreadId As Long) As Long
Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
Declare Function CoMarshalInterThreadInterfaceInStream Lib "ole32.dll" (riid As GUID, ByVal pUnk As IUnknown, ppStm As Long) As Long
Declare Function CoGetInterfaceAndReleaseStream Lib "ole32.dll" (ByVal pStm As Long, riid As GUID, pUnk As IUnknown) As Long
Declare Function CoInitialize Lib "ole32.dll" (ByVal pvReserved As Long) As Long
Declare Sub CoUninitialize Lib "ole32.dll" ()
' Structure to hold IDispatch GUID
 
Type GUID
  Data1 As Long
  Data2 As Integer
  Data3 As Integer
  Data4(7) As Byte
End Type
 
Public IID_IDispatch As GUID
 
 
Private Sub cmdCreateApt_Click()
    Dim c As clsBackground
    Set c = New clsBackground
    StartBackgroundThreadApt c
End Sub
 
' Запуск теневого потока для этого обхекта использующий модель аппартамента возвращает 0 при ошибке
 
Public Function StartBackgroundThreadApt(ByVal qobj As clsBackground)
  Dim threadid&, hnd&, res&, threadparam&
  Dim tobj As Object
  
  Set tobj = qobj
  ' Правильный маршалированный подход
  InitializeIID
 
  res = CoMarshalInterThreadInterfaceInStream(IID_IDispatch, qobj, threadparam)
  If res <> 0 Then
      StartBackgroundThreadApt = 0
      Exit Function
  End If
  
  hnd = CreateThread(0, 2000, AddressOf BackgroundFuncApt, threadparam, 0, threadid)
  If hnd = 0 Then
      Exit Function                         'Возврат нуля в сл. ошибки
  End If
                                            'Нам больше не нужен хендл потока
  CloseHandle hnd
  StartBackgroundThreadApt = threadid
End Function
 
' Инициализация GUID структуры
Private Sub InitializeIID()
  Static Initialized As Boolean
  If Initialized Then Exit Sub
  With IID_IDispatch
    .Data1 = &H20400
    .Data2 = 0
    .Data3 = 0
    .Data4(0) = &HC0
    .Data4(7) = &H46
  End With
  Initialized = True
End Sub
 
Public Function BackgroundFuncApt(ByVal param As Long) As Long
  Dim qobj As Object
  Dim qobj2 As clsBackground
  Dim res&
  
  res = CoInitialize byval &0               'Инициализация OLE для данного аппартамента
                                            'Правильный модельный подход к апартаменту
  res = CoGetInterfaceAndReleaseStream(param, IID_IDispatch, qobj)
  Set qobj2 = qobj
  Do While Not qobj2.DoTheCount(10000)
  Loop
  qobj2.ShowAForm
                                            'Кроме того, вы можете поместить сюда функцию ожидания,
  CoUninitialize                            'затем вызовите функцию qobj, когда ожидание удовлетворено.
End Function                                'Все вызовы CoInitialize должны быть сбалансированы
Класс
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
Option Explicit
' Class clsBackground
' MTDemo 3 - Multithreading example
' Copyright © 1997 by Desaware Inc. All Rights Reserved
Event DoneCounting()
 
Dim l As Long
 
Public Function DoTheCount(ByVal finalval&) As Boolean
    Dim s As String
    If l = 0 Then
        s$ = "In Thread " & App.ThreadID
        MsgBox s$
    End If
    l = l + 1
    If l >= finalval Then
        l = 0
        DoTheCount = True
        MsgBox "Done with counting"
        RaiseEvent DoneCounting
    End If
End Function
 
Public Sub ShowForm()
    Form1.Show
End Sub
0
Вернулся
 Аватар для HackerVlad
1748 / 644 / 45
Регистрация: 10.09.2021
Сообщений: 2,786
08.07.2023, 13:02
testuser2, ты у меня спрашиваешь? я даже не знаю, что такое маршалинг)))

Добавлено через 1 час 30 минут
testuser2, если бы ты мне прислал проект на vb6, я бы посмотрел конечно, а то в этом vba я ничего не понимаю, ну что, разобрался там?
0
1402 / 860 / 93
Регистрация: 08.02.2017
Сообщений: 3,671
Записей в блоге: 2
08.07.2023, 14:26  [ТС]
HackerVlad, будет все попозжа, буду делать, по образцу Трика, когда спадет жара. Надо будет получить CLSID, и IID класса. Наверное можно с помощью OleView. Вот интересная тема

Добавлено через 13 минут
У Трика ест про все эти моменты, ктсати
Класс я назвал MultithreadDownloader, а библиотеку MTDownloader, соответственно ProgID этого объекта MTDownloader.MultithreadDownloader. После компиляции получаем описание интерфейсов через OleView, PEExplorer и т.п. В моем примере CLSID = {20FAEF52-0D1D-444B-BBAE-21240219905B}, IID = {DF3BDB52-3380-4B78-B691-4138300DD304}. Также я поставил галочку RemoteServerFiles чтобы получить на выходе библиотеку типов для нашей DLL, и будем подключать ее вместо DLL для гарантированного запуска приложения.
0
Вернулся
 Аватар для HackerVlad
1748 / 644 / 45
Регистрация: 10.09.2021
Сообщений: 2,786
08.07.2023, 17:26
Да у The Trick'а это всё есть, но тут с помощью DLL, а у The Trick'а есть даже без всяких там DLL дополнительных.
0
1402 / 860 / 93
Регистрация: 08.02.2017
Сообщений: 3,671
Записей в блоге: 2
08.07.2023, 18:10  [ТС]
Цитата Сообщение от HackerVlad Посмотреть сообщение
у The Trick'а есть даже без всяких там DLL
Но в данном случае нужна DLL, зареганая в системе, с публичным классом из которой (точнее из ее tlb) надо получить iid и clsid через хитрую жепку. Чем интересен, такой метод, что вызывающая процедура может не ждать завершения потока, а есть объект соединяющий два потока, и он наверное становится какбы опорой для потока (так рассуждения).
0
Модератор
10060 / 3905 / 885
Регистрация: 22.02.2013
Сообщений: 5,854
Записей в блоге: 79
08.07.2023, 21:00
Цитата Сообщение от testuser2 Посмотреть сообщение
В общем клас создал как в статье, ActiveX-библиотеку скомпилировал в p-code, нашел CLSID класса в реестре. Вопрос куда его прописать в процедуре InitializeIID
Не нужно юзать этот код. В нем не учитываются ньюансы работы вб6 с неинициализированным контекстом потока. Можно создать ActiveX-DLL и без всяких ограничений создавать там потоки. Несколько API функций только объявить в TLB (и то не обязательно).

Цитата Сообщение от testuser2 Посмотреть сообщение
Но в данном случае нужна DLL, зареганая в системе, с публичным классом из которой (точнее из ее tlb) надо получить iid и clsid через хитрую жепку.
Регать необязательно. У меня есть один проект где в разных потоках создаются экземпляры VBScript движка. Все работает без регистрации через SxS манифест.
2
1402 / 860 / 93
Регистрация: 08.02.2017
Сообщений: 3,671
Записей в блоге: 2
09.07.2023, 09:37  [ТС]
Цитата Сообщение от testuser2 Посмотреть сообщение
буду делать, по образцу Трика
Сделал, зависает на этапе инициализации в потке на функции CoMarshalInterThreadInterfaceInStream iid, obj, value.IStream
Попробую с его библиотекой инициализировать еще
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
09.07.2023, 09:37

VBA-проект для создания эл. сообщения в MS Outlook из-под любого VBA-приложения.
Охотно поделюсь этим своим проектом, который можно скачать с http://moscowjobs.narod.ru/mailmngr.html. Вам понадобится WinZip и MS Word...

VBA AutoCad - как снять (изменить) ограничение времени выполнения VBA Макроса?
Столкнулся с проблемой в Автокад 2012 х64 win7 Run-time error(...): Automation error System call failed - возникает если макросы...

VBA SDK. Как включить в проект на VBA конструкторы?
Всем, добрый день! Если кто-то работал с сабжом - не могу понять, как включить в проект на VBA конструкторы, как-то: DataEnvironment,...

Купил книгу По VBA Программирование на VBA 2003 В.Г.Кузьменко
Поздравьте меня я купил книгу По VBA Программирование на VBA 2003 В.Г.Кузьменко, могу процитировать нужную Вам справку

Как получить ссылку на VBA-объект Application в DLL, которая привязана к этому VBA-приложению
Т.е. ситуация обычная - имеем DLL, сделанную в VB, которая может быть привязана к MsOffice приложениям - Access,Word,Excel . Как в этой...


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

Или воспользуйтесь поиском по форуму:
60
Ответ Создать тему
Новые блоги и статьи
Сезонность закисления почв
anaschu 04.07.2026
200 часов это все равно моловато. Есть ситуации, но нестандартные, когда смена происходит за 5 лет. Но обычно это 50 лет и более. Наверное, закисление почвы происходит сезонно в средней. . .
В чем ценность человеческого опыта в глобальном смысле?
kumehtar 03.07.2026
Возможно, ценность человека не в том, что он однажды достигает мудрости, а в том, что он становится носителем карты пути. Он знает не только истину, но и последовательность внутренних изменений,. . .
интеграция AnyLogic с самописным REST API и переход на Odoo
anaschu 03.07.2026
Успешная интеграция AnyLogic с самописным REST API и переход на промышленную Odoo WMS Сегодня проделал огромный путь от простой симуляции физических процессов до построения полноценной. . .
Поиск всех путей на ориентированном графе. Linux
dcc0 02.07.2026
Переработка старого кода из моей статьи. Через несколько переработок от PHP кода к C89 (надеюсь, 89). Но довольно запутанно получилось. Код для Linux. Но если убрать time и то, что с ним. . .
Сам себя обучал rest api
anaschu 02.07.2026
Педагогический лайфхак: Почему чистый REST API для ученика намного круче, чем готовые библиотеки Когда мы отказались от капризного JAR-файла AnyLogic и переписали код на стандартный HttpClient,. . .
rest api anylogic - выполнение модели на своём русском сайте
anaschu 02.07.2026
Как подружиться с AnyLogic Cloud API, победить провайдеров и развернуться Java-бэкенд в Docker на бесплатном хостинге: Двухдневный лог борьбы Всем привет! Хочу поделиться свежим (и довольно. . .
Где деньги лежат
kumehtar 02.07.2026
Это - японская подводная лодка I-52 (тип C2, кодовое имя Momi) вышла из Японии в марте 1944 года с миссией в оккупированную немцами Францию (Лорьян). Это была одна из «Янаги»-миссий по обмену. . .
Krabik для WoW 3.3.5a, многоязычный
AmbA 02.07.2026
Допилил бота, думаю что окончательно. Изменения: - добавлена многоязычность - добавлено снятие скриншотов - добавлено поддержание бафов хождения по воде (для жреца, дк и шамана) - и так, по. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru