|
|
|
CreateComObject in thread
|
|||
|---|---|---|---|
|
#18+
Добрый день. Может кто объяснить причину ошибки? Код: pascal 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. Если это выполнить в консольном приложения - работает. Если убрать поток - работает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.11.2020, 09:38 |
|
||
|
CreateComObject in thread
|
|||
|---|---|---|---|
|
#18+
X-Cite, Сначала приведи к IUnknown, а потом через Supports получи ITest ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.11.2020, 10:47 |
|
||
|
CreateComObject in thread
|
|||
|---|---|---|---|
|
#18+
ziv-2014, var A := CreateComObject(CLSID_Test); A - это и есть IUnknown ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.11.2020, 10:55 |
|
||
|
CreateComObject in thread
|
|||
|---|---|---|---|
|
#18+
X-Cite, сейчас уже не помню, но кажется, что кто первый инициализировал ком в приложении того и тапки, а первым идет апартмент, ЕМНИП. и кстати CoInitializeEx - функция, уверен, что отрабатывает успешно? у меня для сервиса использующего ActiveX компонент написан такой юнит и он стоит первым в проекте Код: pascal 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.11.2020, 11:10 |
|
||
|
CreateComObject in thread
|
|||
|---|---|---|---|
|
#18+
я во всех своих проектах инициализирую/деинициализирую внутри TThread.Execute (просто пример для показа, без проверки Succeeded()), и всё работает: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.11.2020, 11:31 |
|
||
|
CreateComObject in thread
|
|||
|---|---|---|---|
|
#18+
Zelius, Спасибо.. В общем, что получилось... Описал Код: pascal 1. Чтобы узнать какие апартаменты используются Код: pascal 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. Код: pascal 1. 2. Сделал отдельный модуль и указал вначале как у вас и заработало... // APTTYPE_STA A single-threaded apartment. // APTTYPEQUALIFIER_NONE No qualifier information for the current COM apartment type is available. В обоих случаях ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.11.2020, 11:35 |
|
||
|
CreateComObject in thread
|
|||
|---|---|---|---|
|
#18+
Нашел, что OleInitialize вызывается раньше, чем срабатывает InitComObj в System.Win.ComObj Походу это бага... Даже если указать System.Win.ComObj первым, все равно OleInitialize вызывается раньше. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.11.2020, 11:51 |
|
||
|
CreateComObject in thread
|
|||
|---|---|---|---|
|
#18+
asutp2, вот интересно какая модель в итоге в потоке, попробуй CoGetApartmentType ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.11.2020, 11:52 |
|
||
|
CreateComObject in thread
|
|||
|---|---|---|---|
|
#18+
Ну вот... Код: pascal 1. 2. 3. 4. Логично, что создается Application и потом вызывается Application.Initialize; уже в котором вызывается InitComObj в System.Win.ComObj ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.11.2020, 12:00 |
|
||
|
CreateComObject in thread
|
|||
|---|---|---|---|
|
#18+
asutp2, вот в справке интересно авторOleInitialize calls CoInitializeEx internally to initialize the COM library on the current apartment. Because OLE operations are not thread-safe, OleInitialize specifies the concurrency model as single-thread apartment. Once the concurrency model for an apartment is set, it cannot be changed. A call to OleInitialize on an apartment that was previously initialized as multithreaded will fail and return RPC_E_CHANGED_MODE. так что сдается мне у тебя не COINIT_MULTITHREADED ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.11.2020, 12:15 |
|
||
|
CreateComObject in thread
|
|||
|---|---|---|---|
|
#18+
Однозначно баг, потому что в справке сказано авторCoInitFlags Specifies the level of threading support requested for a COM server .EXE. CoInitFlags controls the way COM is initialized for threading support. This variable only affects executables (.EXEs), not in-process servers (.DLLs and .OCXs). Однако OleInitialize переводит в нейтральные аппартаменты, И уже потом сменить их на другие нельзя.. Поэтому текст не будет соответствовать действительности.. P.S. попробую еще вариант с маршалингом апартаментов реализовать, но это такое себе... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.11.2020, 12:31 |
|
||
|
CreateComObject in thread
|
|||
|---|---|---|---|
|
#18+
засада бывает когда стороння либа балуется, как например было с b92583 у девэксов, но там по крайней мере обсудить можно и иногда даже разрешить а порой неприятнее бывает когда прямо по ходу работы сторонние драйвера (принтерные скажем) могут вмешиваться X-Cite попробую еще вариант с маршалингом апартаментов реализовать, но это такое себе ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.11.2020, 13:00 |
|
||
|
CreateComObject in thread
|
|||
|---|---|---|---|
|
#18+
При чем здесь потоки и секция инициализации модуля? Идем в Код: sql 1. или Код: sql 1. и смотрим на значение параметра ThreadingModel. Если там не Both, то CoInitializeEx должно вызываться ровно с тем флагом, который там написан. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.11.2020, 14:16 |
|
||
|
CreateComObject in thread
|
|||
|---|---|---|---|
|
#18+
_Vasilisk_, Это если inproc сервер будет... В Delphi ThreadingModel пишется если библиотека, при регистрации... А у меня сервер exe, при чем только пока запущен, поэтому в реестре ничего нет. Клиент будет вызывать сервер в том же процессе, только мне надо, чтобы в произвольном потоке.. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.11.2020, 14:47 |
|
||
|
CreateComObject in thread
|
|||
|---|---|---|---|
|
#18+
X-Cite Код: pascal 1. 2. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.11.2020, 15:05 |
|
||
|
CreateComObject in thread
|
|||
|---|---|---|---|
|
#18+
_Vasilisk_, Все перепробовал - ничего не работает, из-за того, что OleInitialize вызывается первой... Если первым вызвать CoInitializeEx(nil, COINIT_MULTITHREADED), то tmApartment работает. Еще раз. 1) Сервер - это exe приложение и не регистрируется в реестре. 2) Клиент это же самое приложение. Вызов клиентского кода будет в разных потоках, но в том же процессе. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.11.2020, 15:12 |
|
||
|
CreateComObject in thread
|
|||
|---|---|---|---|
|
#18+
X-Cite Все перепробовал Код: sql 1. или Код: pascal 1. 2. (или tmBoth) X-Cite 1) Сервер - это exe приложение и не регистрируется в реестре X-Cite 2) Клиент это же самое приложение X-Cite то tmApartment работает Потоковые модели должны совпадать. Точка. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.11.2020, 15:42 |
|
||
|
CreateComObject in thread
|
|||
|---|---|---|---|
|
#18+
_Vasilisk_, После вызова OleInitialize модель Neutral Код ниже выполняется уже после того как OleInitialize внутри TApplication.Create выполнился Код: pascal 1. 2. 3. 4. 5. 6. 7. Когда в ответ на CreateComObject вызывается Код: pascal 1. 2. То в этот момент модель Neutral И почему-то не видит ITest В первом сообщении я привел пример. Как без игр с uses сделать так, чтобы работало? Исходя из анализа кода vcl - никак... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.11.2020, 16:04 |
|
||
|
CreateComObject in thread
|
|||
|---|---|---|---|
|
#18+
X-Cite Код ниже выполняется уже после того как OleInitialize внутри TApplication.Create выполнился Вы регистрируете COM сервер и сообщаете системе, в каких потоковых моделях он может работать. Потом создаете поток с совершенно другой потоковой моделью. Правила маршалинга типов не предоставляете. И после этого удивляетесь почему не работает. И это я еще не спрашиваю, зачем вам понадобился COM в рамках одного процесса ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.11.2020, 17:30 |
|
||
|
CreateComObject in thread
|
|||
|---|---|---|---|
|
#18+
_Vasilisk_, окей, а что скажешь на это? Код: pascal 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.11.2020, 18:11 |
|
||
|
CreateComObject in thread
|
|||
|---|---|---|---|
|
#18+
X-Cite, del ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.11.2020, 18:48 |
|
||
|
CreateComObject in thread
|
|||
|---|---|---|---|
|
#18+
X-CiteНашел, что OleInitialize вызывается раньше, чем срабатывает InitComObj в System.Win.ComObj Походу это бага... Даже если указать System.Win.ComObj первым, все равно OleInitialize вызывается раньше это не баг, это фича. для корректной работы oleinitflags нужно задавать до вызова application.initialize. см. секцию инициализации comobj. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.12.2020, 14:01 |
|
||
|
|

start [/forum/topic.php?fid=58&msg=40023283&tid=2037809]: |
0ms |
get settings: |
11ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
200ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
84ms |
get tp. blocked users: |
2ms |
| others: | 253ms |
| total: | 586ms |

| 0 / 0 |
