День добрый!
Возникла необходимость "импортировать" в проект на C# ActiveX, написанный на Delphi5.
У ActiveX объявлен интерфейс для событий:
IOPCClientEvents = dispinterface
['{747E173D-F2CA-46C6-A681-2F208D34170B}']
procedure OnData(Count: Integer; AUserData: OleVariant; AValue: OleVariant;
ATimeStamp: OleVariant; AClientID: OleVariant; AQuality: OleVariant); dispid 1;
procedure OnClientStatusChanged(Status: TClientStatus); dispid 2;
procedure OnServerStatusChanged(const ServerProgID: WideString; ServerState: TServerStatus); dispid 3;
procedure OnLog(const Message: WideString; Level: Integer); dispid 4;
end;
В C# проекте после объявления делегатов делаю следующее:
OPCClientClass mOPCClient = new OPCClientClass();
//выполняется нормально
mOPCClient.OnData += new IOPCClientEvents_OnDataEventHandler(OnData);
// fatal exception 80040202
mOPCClient.OnServerStatusChanged += new IOPCClientEvents_OnServerStatusChangedEventHandler(mOPCClient_OnServerStatusChanged);
mOPCClient.OnLog += new IOPCClientEvents_OnLogEventHandler(OnLog);
mOPCClient.OnClientStatusChanged += new IOPCClientEvents_OnClientStatusChangedEventHandler(mOPCClient_OnClientStatusChanged);
Подписка на любое первое событие выполняется нормально, при попытке подписаться на любое второе событие вызывает ошибку 80040202 — если не ошибаюсь, CONNECT_E_CANNOTCONNECT (
http://support.microsoft.com/kb/183216/EN-US/) в IconnectionPoint::Advise.
Делал так:
mOPCClient.OnData += new IOPCClientEvents_OnDataEventHandler(OnData);
mOPCClient.OnData -= new IOPCClientEvents_OnDataEventHandler(OnData);
mOPCClient.OnServerStatusChanged += new IOPCClientEvents_OnServerStatusChangedEventHandler(mOPCClient_OnServerStatusChanged);
//exception 80040202 строкой ниже
mOPCClient.OnLog += new IOPCClientEvents_OnLogEventHandler(OnLog);
Тот же ActiveX при использовании из Delphi работает без проблем — легко подписываюсь на все 4 события.
Пробовал делать ActiveX и Apartment, и Single, и Both, и Free — бесполезно.
Может кто-нибудь подсказать направление рытья?