2010-10-19 12 views
10

Próbuję skonfigurować rejestrację wolną COM, ale mam niewielki problem w tym, że inny obiekt COM może być klientem.Rejestracja Free Com i manifestów dll

App.exe -----> COM Server/Client DLL (zarejestrowany czy nie) --------> COM Server DLL (nie zarejestrowany)

Moje pytania jest to możliwe utworzyć manifest dla drugiej biblioteki dll (COM Server/Client dll)? Nie mam kontroli nad plikiem wykonywalnym, ale jeśli tak, to działa, jeśli utworzę manifest klienta dla pliku wykonywalnego i manifest serwera dla biblioteki dll COM.

to plik manifestu dla średniej dll. Próbowałem go osadzić i wypróbowałem na zewnątrz. Nadal nie działa.

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"> 
    <assemblyIdentity type="win32" 
        name="COMCliSer.dll" 
        version="1.0.0.0" 
    /> 
    <dependency> 
    <dependentAssembly> 
     <assemblyIdentity 
        name="COMSer.dll" 
        version="1.0.0.0"      
     /> 
    </dependentAssembly> 
    </dependency> 
</assembly> 

Na dalszych badań, mogę to wszystko działa tak długo, jak dll środku jest również rejestracja za darmo i exe ma manifestu aplikacji. Jak tylko zarejestruję środkową bibliotekę DLL i zrzucę manifest aplikacji (nie mam kontroli nad tym, co exe będzie używać mojej biblioteki DLL), cała sprawa przestanie działać.

Jeśli plik exe nie ma manifestu, manifest dll nie jest brany pod uwagę. Mogę to udowodnić, ustawiając wszystko do pracy. Następnie popełniam błąd w manifeście montażowym. Wyskakuje zwykła wiadomość:

Nie można utworzyć procesu: Uruchomienie tej aplikacji nie powiodło się, ponieważ konfiguracja aplikacji jest niepoprawna. Ponowne zainstalowanie aplikacji może rozwiązać ten problem.

Gdybym wtedy upuść manifestu aplikacji, ładowania aplikacji (aczkolwiek w CoCreateInstance nie powiedzie, ponieważ zależności nie są brane pod uwagę)

+0

Dlaczego dzwonisz zespół 'comser.dll'? Czy informacje o manifeście złożenia są połączone? O wiele łatwiej jest wdrożyć zespół o opisowej nazwie np. "Microsoft.VC90.CRT", który zawiera biblioteki dll o różnych nazwach: "msvcr90.dll". Kiedy mamy do czynienia z bibliotekami dll, trudniej jest debugować, ponieważ jeden manifest służy teraz dwóm celom: opisaniu zawartości zestawu dla konsumentów, ORAZ opisaniu zależności biblioteki DLL w zespole. –

+0

Imiona zostały zmienione, aby chronić niewinnych! To nie są prawdziwe nazwiska. Są to rodzime biblioteki dll COM, a nie zespoły .NET. – Steve

+0

Co ponadto oznacza "nie działa"? Czy exe i 2nd dll załadują się i po prostu nie uda się utworzyć instancji trzeciej, czy exe lub 2nd dll nie załadują się całkowicie? Sprawienie, że rzeczy faktycznie nie załadują się, jest dobrym krokiem, ponieważ oznacza, że ​​system widzi manifest i rejestruje błąd co najmniej w systemie lub aplikacji, w dzienniku zdarzeń. Jeśli po prostu nie zadziała na wezwanie do CoCreateInstance, prawdopodobnie nie będzie w ogóle widział manifestu. –

Odpowiedz

5

Wystarczy dodać zależność montażową do serwera/manifeście klienckiego DLL, który wskazuje na com dll serwera.

Należy pamiętać, że manifesty zespołu różnią się od manifestów "aplikacji": manifest zespołu opisuje zespół: nadaje mu nazwę i wyświetla listę bibliotek dll. Manifest aplikacji to zasób osadzony RT_MANIFEST, który opisuje zależności bieżących modułów.

Tak więc, w ostatecznym rozrachunku, to masz:

  • app.exe, z zewnętrznym (app.exe.manifest) lub wbudowanego RT_MANIFEST opisujący zależność od zespołu o nazwie „acme.clientserver”
  • acme.clientserver.manifest opisujący zespół i listing "clisrv.dll" jako rejestracja wolna com dll.
  • clisrv.dll z zewnętrznym (clisrv.dll.2.manifest) lub osadzony RT_MANIFEST, opisującym zależność od zespół zwany „acme.server”
  • acme.server.manifest, opis zespołu, wymieniając Serv .dll jako rejestracja wolna com dll.
  • serv.dll - który może, ale nie musi, zawierać listę zawierającą bardziej zależne złożenia.

Technicznie możliwe jest wywołanie zestawu przez nazwę biblioteki DLL i scalenie razem zespołu i manifestu biblioteki DLL - obsługuje go program ładujący win32, ale niektóre ustawienia obowiązujące w manifestach aplikacji nie są poprawne w manifestach zespołu , co może spowodować, że wynikowy montaż nie zostanie załadowany. To także sprawia, że ​​bardzo trudno jest podpisać cyfrowo.


WRT exe musi mieć manifest: Zazwyczaj manifest exe określa domyślny kontekst aktywacji procesów. Nie jestem w 100% pewien, jak zachowuje się okno, gdy exe nie ma manifestu, ale jestem prawie pewien, że manifesty w bibliotekach DLL będą nadal przetwarzane.

Co oznacza, że ​​problem sprowadza się do braku obsługi izolacji w CoCreateInstance - z jakiegoś powodu - domyślnie - CoCreateInstance wyszukuje tylko domyślny kontekst aktywacji dla wpisów COM.

Sposób przesłonić to ręcznie zbudować własny kontekst aktywacyjny, używając Activation Context API

Podstawową metodą byłoby zadzwonić:

  • CreateActCtx - stworzenie kontekstu aktywacji od DLL oczywistych .
  • AktywacjaActCtx - w celu aktywacji kontekstu
  • CoCreateInstance - przeszuka bieżący kontekst aktywacji dla wpisów w komendach darmowych reg.
  • DeactivateActCtx - aby przywrócić domyślny kontekst aktywacji.

Możesz dodać/D ISOLATION_AWARE_ENABLED zawinąć większość połączeń okien, które są dokonywane przez kontekstach aktywacyjnych, z jakiegoś powodu nie jest owinięty CoCreateInstance:/

+0

Nie mam app.exe.manifest (nie potrzebuję go, ponieważ jest zarejestrowana średnia dll com). Próbowałem dodać manifest do średniej dll, ale bez skutku. – Steve

+0

Czy otworzyłeś środkową bibliotekę DLL w edytorze zasobów (np. Visual Studio) i zobaczyłeś, czy ma on zasób RT_MANIFEST i co w nim jest? VS zawsze wyświetla RT_MANIFESTS jako hex, więc musisz wyeksportować go, aby zobaczyć go jako tekst. –

+0

OK, zrobiłem to. Dll ma dwa RT_Manifests, jeden, który, jak sądzę, został umieszczony przez kompilator (Delphi) wymieniający Windows Common Controls jako zależność, a drugi 1, który dodałem, który jest wyświetlany powyżej. – Steve

Powiązane problemy