Звонить CoInitialize()
из DllMain()
- плохая вещь; Есть множество ограничений на то, что вы можете сделать с DllMain()
; смотри здесь: http://blogs.msdn.com/larryosterman/archive/2004/04/23/118979.aspx
Даже если он ДЕЙСТВИТЕЛЬНО работал, тогда инициализация COM изнутри DllMain()
не особенно полезна, поскольку COM инициализируется для каждого потока, и вы не знаете, что само приложение хочет сделать в отношении COM-квартир. для потока, который вы хотите инициализировать COM для ... Это означает, что вы можете инициализировать COM одним способом, а затем приложению может потребоваться инициализировать его другим способом и может произойти сбой из-за того, что сделала ваша DLL ...
Вы МОЖЕТЕ раскрутить поток в DllMain()
до тех пор, пока вы будете осторожны (см. Здесь http://blogs.msdn.com/oldnewthing/archive/2007/09/04/4731478.aspx), а затем инициализировать COM в этом потоке и выполнить всю работу, связанную с COM, в этом потоке. собрать все данные, которые вам нужны для использования COM, из любого потока, к которому вы обращаетесь, в свой собственный поток COM и выполнить вызов COM оттуда ...
И затем возникает вопрос о том, будет ли экземпляр создаваемого вами COM-объекта (вы могли бы надежно сделать то, что вы хотите сделать) использоваться из потока, который вызывал вашу DLL, чтобы сделать вызов ... Вы Вы понимаете, как вам нужно маршалировать указатель интерфейса, если это необходимо, и т. д.
В качестве альтернативы вы должны предоставить СВОЮ функциональность через COM, а затем приложение загрузить вашу DLL как COM DLL, и все будет работать нормально. Вы можете указать тип квартиры, который вам нужен, и приложение будет отвечать за правильную настройку.
Итак, в общем, вам не нужен ответ на ваш вопрос.