|
CreateThread for 64 - bit (AddressOf)
|
|||
---|---|---|---|
#18+
Доброго дня господа ! Необходимо из под 64-bit Excel запустить поток Использую стандартный прием с CreateThread Вопрос как передать адрес пользов. функции AddressOf не работает Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16.
Спасибо ... |
|||
:
Нравится:
Не нравится:
|
|||
02.12.2020, 21:22 |
|
CreateThread for 64 - bit (AddressOf)
|
|||
---|---|---|---|
#18+
HOME_X, В таком виде работает, точнее пытается работать, но может упасть легко. Вообще выводить MsgBox нельзя (это не UI поток) и использовать вообще VBA функции из другого потока не желательно (вероятность что упадёт высока). Возможно это связано с особенностью рантайма. Лучше вместо запуска потока запускать другой процесс в котором выполнять логику и написать велосипед для синхронизации данных между процессами, если уж так хочется. Пока отлаживал код, раз 15 падал Excel и то, скорее всего где-то с типами косяки ещё есть Код: vbnet 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.
... |
|||
:
Нравится:
Не нравится:
|
|||
03.12.2020, 23:33 |
|
CreateThread for 64 - bit (AddressOf)
|
|||
---|---|---|---|
#18+
VBA не поддерживает многопоточность ... |
|||
:
Нравится:
Не нравится:
|
|||
04.12.2020, 02:46 |
|
CreateThread for 64 - bit (AddressOf)
|
|||
---|---|---|---|
#18+
VSVLAD Val(AddressOf PressKey), ByVal 0&, ByVal 0&, iThread) Ваш прием понятен - спасибо ! Насчет Wait - здесь надуюсь будет все в норме Это "таблетка" для автозапуска диал. окна Outlook ... |
|||
:
Нравится:
Не нравится:
|
|||
05.12.2020, 23:00 |
|
CreateThread for 64 - bit (AddressOf)
|
|||
---|---|---|---|
#18+
Eolt VBA не поддерживает многопоточность Почему? А как же DoEvents? ... |
|||
:
Нравится:
Не нравится:
|
|||
06.12.2020, 01:44 |
|
CreateThread for 64 - bit (AddressOf)
|
|||
---|---|---|---|
#18+
Focha Eolt VBA не поддерживает многопоточность Почему? Разработчики VBA посчитали что нативная поддержка многопоточности в языке не нужна и только запутает пользователей. авторDoEvents К многопоточности это не имеет отношения. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.12.2020, 09:28 |
|
CreateThread for 64 - bit (AddressOf)
|
|||
---|---|---|---|
#18+
Eolt, Доброго дня господа ! НЕ !! все получилось .... борюсь еще спасибо за подсказки ... |
|||
:
Нравится:
Не нравится:
|
|||
06.12.2020, 16:47 |
|
CreateThread for 64 - bit (AddressOf)
|
|||
---|---|---|---|
#18+
HOME_X, А что в WIN10x64 нет аналогичных функций Имею в виду Private Declare PtrSafe Function CreateThread Lib "kernel32" (ByVal lpThreadAttributes As Any, ByVal dwStackSize As Long, ByVal lpStartAddress As LongPtr, lpParameter As Any, ByVal dwCreationFlags As Long, lpThreadID As Long) As LongPtr Private Declare PtrSafe Function CreateThread Lib "kernel 64 " (ByVal lpThreadAttributes As Any, ByVal dwStackSize As Long, ByVal lpStartAddress As LongPtr, lpParameter As Any, ByVal dwCreationFlags As Long, lpThreadID As Long) As LongPtr Зачем использовать 32-bit библиотеки ? ... |
|||
:
Нравится:
Не нравится:
|
|||
06.12.2020, 16:50 |
|
CreateThread for 64 - bit (AddressOf)
|
|||
---|---|---|---|
#18+
VSVLAD, Спасибо Вам за помощь ! Но не могли бы подправить (ИЛИ ПОДСКАЗАТЬ как отладить в потоке код) Для отладки располагаю только (!!!!!!) оболочкой EXCEL. Суть кода - запуск сообщений по Outlook В процессе оправки (Outlook.Send) Проявляется окно диалога с вопросом "Прога хочет отправить сообщение" Три кнопки "Разрешить" "Запретить" "Справка" Как отключить такой диалог знаю, но не имею орг. возможностей В 32-bit версии просто ДОЖИМАЛ кнопку "Разрешить" из предварительно запущенного потока hThread = CreateThread(ByVal 0&, ByVal 0&, Val(AddressOf PressKey), ByVal 0&, ByVal 0&, iThread) Сейчас 64-bit - не совсем понимаю что и как привести к такому типу данных LongPtr Код абсолютно рабочий - запуск c 1-го экземпляра Excel = SendFileOutlook (с блокировкой 'hThread = CreateThread.............) - запуск с 2-го зкземпляра Excel = PressKey - активизация окна диалога = Microsoft Outlook - активизация кнопки = Разрешить Такой дожим кнопки происходит корректно, но запуск с одного экземпляра приводит к ошибке Как отследить ошибку не совсем понимаю.... Подскажите(подправьте) пожалуйста Код: vbnet 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. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108.
Заранее благодарен ! ... |
|||
:
Нравится:
Не нравится:
|
|||
06.12.2020, 19:18 |
|
CreateThread for 64 - bit (AddressOf)
|
|||
---|---|---|---|
#18+
авторСейчас 64-bit - не совсем понимаю что и как привести к такому типу данных LongPtr Если эксель 32-битный, то никак. Если 64-битный, то в нем появился тип LongLong ... |
|||
:
Нравится:
Не нравится:
|
|||
07.12.2020, 08:44 |
|
CreateThread for 64 - bit (AddressOf)
|
|||
---|---|---|---|
#18+
Eolt авторDoEvents К многопоточности это не имеет отношения. Именно на этой команде и идет слет потока Не могли бы подсказать как ее изобразить 64 - bit версии VBA ... |
|||
:
Нравится:
Не нравится:
|
|||
07.12.2020, 19:33 |
|
CreateThread for 64 - bit (AddressOf)
|
|||
---|---|---|---|
#18+
Antonariy, Excel 64 Bit На тип LongPtr перевел все функции которые имеют отношение к объектам (указатели окон диалогов) Private Declare PtrSafe Function GetCurrentThreadId Lib "kernel32" () As LongPtr Private Declare PtrSafe Function GetWindowThreadProcessId Lib "user32" (ByVal hwnd As LongPtr , lpdwProcessId As Long) As LongPtr Но запустить в одном экземпляре - ни как не получаеться В двух (Press - один Excel) (Outlook - другой Excel) - все работает предсказуемо Заранее благодарен ! ... |
|||
:
Нравится:
Не нравится:
|
|||
07.12.2020, 19:39 |
|
CreateThread for 64 - bit (AddressOf)
|
|||
---|---|---|---|
#18+
HOME_X Eolt пропущено... К многопоточности это не имеет отношения. Именно на этой команде и идет слет потока Не могли бы подсказать как ее изобразить 64 - bit версии VBA Падает потому что команда часть рантайма VBA, а он не поддерживает многопоточность. Есть вариант Doevents на Api, если нужно могу через пару дней скинуть. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.12.2020, 22:26 |
|
CreateThread for 64 - bit (AddressOf)
|
|||
---|---|---|---|
#18+
HOME_X, Может проще под конкретную задачу, сделаете на VB6 отдельный Exe, который будет жать кнопку. А из под OutLook уже управлять им (запуск/остановку приложения). Либо можно отдельный файлик Excel иметь с логикой нажатия. И уже запускать отдельный экземпляр Excel с запуском макроса. Либо конкретно под вашу задачу, можно даже не создавать отдельный поток, а создать функцию-таймера и там уже выполнять логику. Вариантов реализаций несколько есть ... |
|||
:
Нравится:
Не нравится:
|
|||
08.12.2020, 12:00 |
|
CreateThread for 64 - bit (AddressOf)
|
|||
---|---|---|---|
#18+
Eolt Падает потому что команда часть рантайма VBA, а он не поддерживает многопоточность. Есть вариант Doevents на Api, если нужно могу через пару дней скинуть. Т.е. ИМЕННО Excel 2016 64-bit не поддерживает многопоточность ? C какой именно точки отсчета (версии, разрядности.....) P.S. старая работающая версия была реализована в Excel 2010 32-bit вариант Doevents на Api - если Вас не затруднит ... будет очень полезно ... |
|||
:
Нравится:
Не нравится:
|
|||
09.12.2020, 22:13 |
|
CreateThread for 64 - bit (AddressOf)
|
|||
---|---|---|---|
#18+
VSVLAD HOME_X, Может проще под конкретную задачу, сделаете на VB6 отдельный Exe, который будет жать кнопку. А из под OutLook уже управлять им (запуск/остановку приложения). Либо можно отдельный файлик Excel иметь с логикой нажатия. И уже запускать отдельный экземпляр Excel с запуском макроса. Либо конкретно под вашу задачу, можно даже не создавать отдельный поток, а создать функцию-таймера и там уже выполнять логику. Вариантов реализаций несколько есть " отдельный экземпляр Excel " - реализовано - без особого восторга отписать 32-bit класс(приложение) в ДОНАЖАТЬ кнопку - есть такое соображение " создать функцию-таймера" - если не сложно уточните пожалуйста КОДОМ ... Спасибо ... |
|||
:
Нравится:
Не нравится:
|
|||
09.12.2020, 22:17 |
|
CreateThread for 64 - bit (AddressOf)
|
|||
---|---|---|---|
#18+
HOME_X Т.е. ИМЕННО Excel 2016 64-bit не поддерживает многопоточность ? C какой именно точки отсчета (версии, разрядности.....) Никакая версия VBA не поддерживает многопоточность. авторвариант Doevents на Api - если Вас не затруднит ... будет очень полезно Вот тут есть примеры реализации. https://www.vbforums.com/showthread.php?315416 ... |
|||
:
Нравится:
Не нравится:
|
|||
10.12.2020, 00:02 |
|
CreateThread for 64 - bit (AddressOf)
|
|||
---|---|---|---|
#18+
HOME_X " создать функцию-таймера" - если не сложно уточните пожалуйста КОДОМ ... Когда отобразится окно для подтверждения отправки письма, код VBA в процессе может быть приостановлен. Остановка будет, скорее всего, не через метод аналогичный API Sleep, иначе весь интерфейс (у меня Excel) также засыпает. В примере ниже не сможет код отработать, т.к. Sleep тормозит всё. Для вашей ситуации надо простестировать, может и сможет быть вызвана функция, когда будет открыто диалоговое окно Module Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21.
Module Код: vbnet 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.
... |
|||
:
Нравится:
Не нравится:
|
|||
10.12.2020, 13:46 |
|
CreateThread for 64 - bit (AddressOf)
|
|||
---|---|---|---|
#18+
VSVLAD, Дал начальную большую задержку ДO момента активации окна OutLook DoEvents отключил совсем Hande окон и кнопок получаю <>0 Код: vbnet 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.
Получаю такой эффект - как бы нажалась кнопка = SendMessage(hBut, BM_SETSTATE..............) - но окно "ТРЕХ КНОПОК" по прежнему наблюдаю на экране если выйти из фокуса этого окна - перейти в окно FAR или активного Excel или любое другое Система отрабатывает предсказуемо Повторно под 32 все работало в 64 bit вот такая чепуха. Может что-то не так в этом блоке iThread = GetCurrentThreadId() iDialog = GetWindowThreadProcessId(hwnd, 0&) Call AttachThreadInput(iThread, iDialog, True) Call SetActiveWindow(hwnd) Call SetFocusAPI(hBut) Call SendMessage(hBut, BM_SETSTATE, True, ByVal 0&) Call SendInput(2, SetInput(0), Len(SetInput(0))) Call AttachThreadInput(iThread, iDialog, False) -------------------------------------------- Вот этого я совсем не понимаю For I = 0 To 1 KeyInput.wVk = VK_RETURN KeyInput.wScan = 0 KeyInput.dwFlags = IIf(I = 0, 0, KEYEVENTF_KEYUP) KeyInput.Time = 0 KeyInput.dwExtraInfo = 0 SetInput(I).dwType = INPUT_KEYBOARD Call CopyMemory(SetInput(I).xi(0), KeyInput, Len(KeyInput)) Next I --------------------------------- Спасибо ... |
|||
:
Нравится:
Не нравится:
|
|||
21.12.2020, 21:40 |
|
CreateThread for 64 - bit (AddressOf)
|
|||
---|---|---|---|
#18+
HOME_X, SendInput = насколько понимаю это имитация нажатия Но разрядность другая - следовательно типы описанные ранее не соответствуют Что-то аналогичное есть https://progi.pro/sendinput-i-64-bit-4374889 Кто хорошо разбирается в API подскажите как правильно привести 32 bit к 64 bit структуре Спасибо ... |
|||
:
Нравится:
Не нравится:
|
|||
21.12.2020, 23:56 |
|
|
start [/forum/topic.php?fid=60&msg=40025045&tid=2154755]: |
0ms |
get settings: |
9ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
26ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
61ms |
get tp. blocked users: |
1ms |
others: | 281ms |
total: | 411ms |
0 / 0 |