У меня есть работа Мне нужно заполнить DLL, как только она будет загружена. Работа включает синхронизацию и поэтому не может быть выполнена внутри dllmain. Есть ли способ запустить код для выполнения, как только dllmain (или все dllmains) будет завершено?Как узнать, когда dllmain завершен?
ответ
По this MSDN post:
Во время запуска процесса и DLL подпрограмм инициализации, новые темы может быть созданы, но они не начинают выполнения до инициализации DLL не сделана для процесса.
Если это верно, то вы должны иметь возможность выполнять свою работу в теме, о которой идет речь, которая не запускается до завершения DLLMain. Конечно, это оставляет некоторые возможные проблемы синхронизации открытыми. Если вы используете Mutex, возможно, вы сможете это решить.
ПРИМЕЧАНИЕ: Я не пробовал это, он просто выглядит, как теоретически, это может сработать.
P.S. Если вы попробуете, PLS оставить комментарий о том, работает ли он или нет.
Самый простой способ - это, вероятно, поместить весь код в другую функцию, которую вы вызываете после загрузки библиотеки.
Вы также можете создать поток, который выполняет эту работу, но я не уверен, что именно вы пытаетесь сделать.
Это, по моему мнению, долгое время было тернистым. Если DLL используется сторонними приложениями, над которыми у вас нет контроля, тогда трудно заставить другие приложения вызвать некоторую функцию инициализации. В конечном счете, это может быть требование, но, конечно же, неплохо не делать этого, чтобы использовать DLL (например, инициализацию winsock).
Если вызов инициализации невозможен, вполне вероятно, что вам нужно полагаться на ленивую инициализацию, которая происходит по требованию. Я столкнулся с довольно приличной бумагой на DLL Best Practices, что, возможно, стоит прочитать. У этого есть хороший список конкретных вещей, которые вы можете и не можете сделать внутри DLLMain. По опыту я знаю, что они должны соблюдаться (список «не надо»).
- 1. Как узнать, когда mysqldump завершен
- 2. Как узнать, когда цикл завершен в сборке?
- 3. Как узнать, когда WebRequest полностью завершен?
- 4. Как узнать, когда запрос SQLite завершен
- 5. Как узнать, когда блок был завершен
- 6. как узнать, когда ответ dde завершен?
- 7. Как узнать, когда завершен рендеринг WebView
- 8. Использование Spring threading и TaskExecutor, как узнать, когда поток завершен?
- 9. Как я могу узнать, когда рендеринг завершен на ngRepeat
- 10. Spring Integration: как узнать, когда завершен рабочий процесс?
- 11. Как узнать, когда процесс генерации индекса Lucene завершен
- 12. Как узнать, когда завершен цикл for с NSURLSessionDataTasks
- 13. В UITableView, как узнать, когда scrollRectToVisible завершен для строки?
- 14. Как узнать, когда процесс установки приложения clickonce завершен?
- 15. Учитывая асинхронный блок, как узнать, когда блок будет завершен?
- 16. Как узнать, когда асинхронный поиск с использованием MapKit завершен
- 17. Знайте, когда поток завершен
- 18. [UIView setNeedsDisplay]: есть ли простой способ узнать, когда drawRect завершен?
- 19. Есть ли хороший способ узнать, когда CLMocationManager's startMonitoringForRegion завершен?
- 20. Как найти, когда переход завершен
- 21. Как найти, когда поток завершен?
- 22. PYTHON Как определить, когда был завершен процесс
- 23. Обнаружение, когда процесс завершен (но не завершен)
- 24. Когда будет вызываться DllMain с флагом DLL_PROCESS_VERIFIER?
- 25. Когда ответ HTTP завершен?
- 26. Узнайте, когда document.location.href завершен
- 27. Обнаружение, когда FileStreamResult завершен
- 28. Когда SendAsync завершен?
- 29. callback когда метод завершен
- 30. Rspec: когда сбой завершен
Как примечание: документ «лучшие практики», упомянутый в ответе Марка Уилкинса, рекомендует не вызывать 'CreateThread()' (хотя он и признает, что это можно сделать). Протестируйте внимательно, если вы решите пойти по этому маршруту. –
Я согласен, что лучший способ сделать это - создать процедуру инициализации и иметь пользователей вызова DLL, которые являются частью API. Это обычное дело, например, WinSock и IBM MQSeries –
Скручивание потока, похоже, сработало. По словам Раймонда Чена, вы должны быть осторожны, что вы там делаете, потому что вы можете зайти в тупик, если вы ждете от этого потока изнутри dllmain. См. Http://blogs.msdn.com/oldnewthing/archive/2007/09/04/4731478.aspx –