Изолированное (Reg Free) поведение COM-компонента - PullRequest
0 голосов
/ 16 марта 2010

У меня довольно неловкая ситуация.

У меня есть один небольшой COM-компонент (назовем его SmallCOM), который представляет собой (Delphi) win32 dll, который я использую из управляемой сборки C # (через COM).

У меня есть один большой COM-компонент (назовем его BigCOM), который представляет собой (Delphi) win32 dll и который я использую из той же управляемой сборки c # (снова через COM).

И что самое забавное, BigCOM также создает и использует SmallCOM через COM.

Все это происходит в одном и том же процессе, и по какой-то причине я иногда сталкиваюсь с неуловимым исключением низкого уровня, говоря мне (когда анализируется с помощью windgb), что:

STACK_COMMAND:  .cxr 00000000 ; kb ; ~10s; .ecxr ; kb 

SYMBOL_STACK_INDEX:  2 

SYMBOL_NAME:  SmallCOM+178c6

FOLLOWUP_NAME:  MachineOwner

MODULE_NAME: SmallCOM 

IMAGE_NAME: SmallCOM.dll

DEBUG_FLR_IMAGE_TIMESTAMP:  2a425e19

FAILURE_BUCKET_ID: 

NULL_CLASS_PTR_DEREFERENCE_c0000005_SmallCOM.dll!Unloaded

BUCKET_ID: APPLICATION_FAULT_NULL_CLASS_PTR_DEREFERENCE_INVALID_POINTER_WRITE_SmallCOM+178c6

WATSON_STAGEONE_URL: http://watson.microsoft.com/StageOne/C#Service_exe/2_4_0_1/4ad7147f/ntdll_dll/5_2_3790_3959/45d70ad8/c0000005/0004afb2.htm?Retriage=1

Followup: MachineOwner

Я полагаю, что BigCOM поработал с SmallCOM и освободил его, что делает невозможным его повторное использование из C # exe (и его перезагрузка не подлежит сомнению, exe - это служба, которая является многопоточной, и использует этот SmallCOM, даже когда BigCOM работает).

Итак, мой вопрос таков: решит ли проблема использование изолированного Reg-Free COM для изоляции SmallCOM в моем C # exe? Или BigCOM и C # exe, все еще использующие один и тот же процесс, будут использовать один и тот же SmallCOM.dll, несмотря ни на что?

Заранее спасибо! Etienne.

1 Ответ

1 голос
/ 17 марта 2010

Если dll выгружен (это то, что будет делать среда выполнения COM, а не приложение напрямую), тогда, вероятно, библиотека возвращает значения преждевременно из DllCanUnloadNow (при условии, что это DLL реализует функцию).

Если это так, то это либо ошибка в SmallCOM, которая требует исправления, либо в качестве помощи от группы вы вызываете GetModuleHandleEx с флагом GET_MODULE_HANDLE_EX_FLAG_PIN, который останавливает когда-либо выгруженную DLL.

...