Reputation: 87
I have been writing DLL on C++, that will be use in C#. DLL have some function, where I call
hres = CoInitializeEx(NULL, COINIT_MULTITHREADED);
and next call
hres = CoInitializeSecurity(
NULL,
-1, // COM authentication
NULL, // Authentication services
NULL, // Reserved
RPC_C_AUTHN_LEVEL_PKT, // Default authentication
RPC_C_IMP_LEVEL_IMPERSONATE, // Default Impersonation
NULL, // Authentication info
EOAC_NONE, // Additional capabilities
NULL // Reserved
);
There are no error then I trying to use this dll in C++. But if I call function from DLL via C# application I see Error (80010106) Cannot change thread mode after it is set. I changed
hres = CoInitializeEx(NULL, COINIT_MULTITHREADED);
to
hres = CoInitialize(NULL);
After this changes error appear after CoInitializeSecurity:
(80010119) Security must be initialized before any
interfaces are marshalled or unmarshalled. It
cannot be changed once initialized.
How resolve this trouble?
Upvotes: 3
Views: 3476
Reputation: 116724
You could remove the call to CoInitializeEx
and CoInitializeSecurity
from your DLL. They have already been called on the thread - that's why you get these errors.
However, if your DLL is trying to initialize a COM thread as a multithreaded apartment, and your C# application is calling the DLL on a single-threaded apartment, then you may have a basic incompatibility. It depends whether the line of code that specified COINIT_MULTITHREADED
was a deliberate choice with a reason behind it, or just something that seemed to work at the time it was originally written.
Upvotes: 3