Почему COM CoInitializeSecurity терпит неудачу в моей DLL? - PullRequest
7 голосов
/ 14 апреля 2011

В настоящее время я изучаю VSHADOW.EXE 3.0 из MS Windows SDK 6.1. Я сделал версию, которая может быть скомпилирована в DLL, которая экспортирует только одну вновь написанную функцию, которая ожидает командную строку в виде строки, токенизирует ее и затем вызывает старый wmain. DLL не COM-сервер.

Он работает точно так же, как старый, когда скомпилирован как EXE, но не совсем работает, когда скомпилирован как DLL, потому что этот вызов не выполняется:

 CoInitializeSecurity(NULL, -1, NULL, NULL, 
                      RPC_C_AUTHN_LEVEL_PKT_PRIVACY, 
                      RPC_C_IMP_LEVEL_IDENTIFY, 
                      NULL, EOAC_NONE, NULL);

, который завершается с ошибкой HRESULT 0x80010119 (RPC_E_TOO_LATE, Безопасность должна быть инициализирована перед маршалингом или демаршалированием любых интерфейсов. Его нельзя изменить после инициализации. )

Я запускаю экспортированную функцию из программы VB6, где функция импортируется с помощью Declare Function vss Lib vshadow.dll ....

Означает ли ошибка, что программа VB6 уже называется CoInitializeSecurity? Что я могу сделать против ошибки?

Кроме того, у меня есть еще один вопрос: почему были выбраны именно значения безопасности RPC_C_AUTHN_LEVEL_PKT_PRIVACY и RPC_C_IMP_LEVEL_IDENTIFY? Какое влияние окажут другие настройки?

1 Ответ

12 голосов
/ 14 апреля 2011

Есть несколько стандартных COM-вызовов, которые не принадлежат DLL.Как и CoInitializeEx (), вызов, который инициализирует COM для потока.DLL не владеет потоком, она бессильна переопределить состояние квартиры, которое выбрал EXE.

CoInitializeSecurity () - это еще одна функция, задача EXE - вызывать ее.Только он знает правильные значения для передачи, именно он определяет политику безопасности.DLL не может, она ничего не знает о клиентском процессе.

...