Wymagane jest użycie formantu ActiveX innej firmy.Formant ActiveX bez formularza
Jedynym problemem jest to, że warstwa w naszym oprogramowaniu jest warstwą biznesową i nie ma dostępu do okna lub formularza. Działa również na osobnych wątkach (i powinno działać z dowolnego wątku), które nie są STA.
Zamiast łamiąc nasze oddzielenie interfejsu użytkownika od logiki biznesowej, użyliśmy tego obejścia, aby to działało:
Thread thread = new Thread((ThreadStart)
delegate
{
_myActiveX = new MyActiveXType();
_myActiveX.CreateControl();
//more initialize work
Application.Run();
});
thread.SetApartmentState(ApartmentState.STA);
thread.IsBackground = true;
thread.Start();
Następnie w każdej chwili musimy odwoływać się do kontroli, nazywamy _myActiveX.BeginInvoke()
lub Invoke()
.
Utylizując tę klasę (opuszczając naszą aplikację), pozbieramy kontrolę i przerywamy wątek.
Moje pytanie brzmi, czy są jakieś problemy z tym związane? Czy jest lepszy sposób to obsłużyć?
Czy jest lepiej przygotowany do pracy z formantem ActiveX z nieznanego środowiska wielowątkowego? Staramy się napisać naszą klasę w sposób, który owija kontrolę, ale działa z dowolnego wątku.
AKTUALIZACJA: Zgodnie z sugestią sugerujemy raczej użycie standardowego obiektu COM i nieużywanie kontrolki. Nasz problem polegał na tym, że uzyskalibyśmy błąd "(Wyjątek od HRESULT: 0x8000FFFF (E_UNEXPECTED)" przy pierwszej metodzie lub właściwości, którą wywołujemy w obiekcie COM.) Jest to generyczny błąd, którego nie otrzymujemy podczas korzystania z ActiveX , wszelkie pomysły?
AKTUALIZACJA: Nasze ocx to "CX25.ocx", przy użyciu narzędzia tlbimp.exe otrzymujemy plik CX25Lib.dll.Za pomocą narzędzia aximp.exe otrzymujemy pliki AxCX25Lib.dll i CX25Lib.dll. CX25Lib.dll nie działa w obu przypadkach działa AxCX25Lib.dll
Powyższy kod, o którym wspomnę, działa. Czy ktoś musiał używać formantu ActiveX bez formularza? A może ktoś miał problemy z używaniem standardowego obiektu COM, ale zauważył, że ActiveX działa? – jonathanpeppers
Czy znalazłeś rozwiązanie tego problemu? Podejrzewam, że poprawne podejście zależy od tego, czy nie oczekujesz wywołań zwrotnych/zdarzeń z kontrolki, ponieważ zależałoby by to od pompy komunikatów Windows do obsługi. – Tormod
Tak, powyższy kod działa. Używamy go od ponad roku teraz bez problemu. Używamy go również z wieloma bibliotekami COM. Zakończyliśmy zawijanie go w klasie i zaimplementowaliśmy Invoke/BeginInvoke do interakcji z kontrolką, która jest wymagana. – jonathanpeppers