2013-04-02 7 views
5

muszę zwolnić kilka zmian w wybranych bibliotek DLL (proste zmiany wewnętrzne metod - nic, że łamie zgodność według this)VB6 - zwalniając tylko kilka DLL o ciężkie uzależnienie nie łamiąc żadnych odniesień

Więc ogólnie przyjętą metodą jest zachowanie starych bibliotek DLL w osobnym katalogu współdzielonym i podczas tworzenia nowych bibliotek DLL kompilacja ich przy użyciu zgodności binarnej do starego zestawu bibliotek DLL. Robi się to, aby nie zmieniać identyfikatorów GUID podczas rejestrowania moich nowych bibliotek DLL. Te identyfikatory GUID są używane jako odniesienia w innych bibliotekach DLL, które nie zostały zakłócone podczas wydawania.

Teraz, gdy próbuję utworzyć dowolną z nowych bibliotek DLL, pojawia się ostrzeżenie: "Plik DLL lub EXE zawierający bibliotekę binarną zawiera typ parametru lub typ zwracany, którego definicji nie można znaleźć". Jestem pewien, że nie dodałem niczego, aby złamać regułę zgodności binarnej (brak zmian w sygnaturze, publicznych metodach, zmiennych itp.). Czy jestem noobem, nie sprawdzając czegoś podstawowego?

Drapanie głową od rana. Każda pomoc jest doceniana.

EDYCJA: Jeśli w ogóle są zmiany w moim podpisie, Czy istnieje sposób, że mogę wiedzieć bez porównywania kodu?

+1

Możliwe, że twój kod wcześniej złamał kompatybilność. VB6 nie ostrzega, gdy dodajesz nową publiczną metodę lub właściwość, ale kolejne kompilacje tworzą różne typy - ponieważ twoja referencyjna biblioteka DLL nie zawiera jeszcze tej nowej metody. (Często ustawiam kompatybilność biblioteki DLL z samą biblioteką dll.) Myślę (ale nie doświadczyłem), że konkretna wiadomość (... nie można znaleźć definicji) może wskazywać na pewną zmianę w referencjach projektu lub jeśli odinstalowałeś/wyrejestrowałeś jakiś inny składnik z twojego systemu. – Arvo

+2

Binarny cel zgodności używa typów z zewnętrznego typelibu (prawdopodobnie innego projektu VB6), który nie jest poprawnie zarejestrowany na maszynie budującej lub jest nową/starą niekompatybilną wersją. – wqw

+0

@Arvo - Tak, możliwe, że kod został złamany wcześniej. W takim przypadku powinny istnieć co najmniej dwa typeliby (jeden przed przerwą i jeden za później). Ale mój rejestr zawiera tylko jeden – maverick

Odpowiedz

2

Weź stare pliki DLL i dodaj do nich prefiks compat_.

Zasadniczo zmień nazwę pliku MyAppDataAccess.dll na compat_MyAppDataAccess.dll.

Teraz przejdź do właściwości Twojej biblioteki ActiveX DLL i ustaw projekt jako zgodny z binarną z nowym compat_MyAppDataAccess.dll, jak poniżej.

Teraz wystarczy zbudować bibliotekę DLL i wdrożyć ją.

Powinno działać. Jeśli w rzeczywistości Twoja kompatybilność binarna zostanie zerwana w wyniku twoich zmian, otrzymasz ostrzeżenie z informacją o tym.

enter image description here

+0

Czy nie byłoby to podobne do odwoływania się do samej biblioteki DLL? Nie jestem pewien, czy to dobra droga. Brzmi strasznie. Czy nie muszę rejestrować ich obu? – maverick

+0

Zasadniczo tak, ale dlaczego miałoby to być przerażające? Nie musiałbyś rejestrować ich obu. "Compat_" służy tylko do zapewnienia zgodności binarnej - nie musisz go rozprowadzać. Mam kilka aplikacji VB6, które mają mnóstwo zależności od bibliotek i jest to jedyny sposób, aby upewnić się, że biblioteki nie łamią kompatybilności binarnej. – AngryHacker

+0

OK! To działa. Stworzyłem oddzielny folder dla moich kompatybilnych bibliotek DLL we współdzielonej lokalizacji. Przyjęcie odpowiedzi, ponieważ rozwiązał mój problem. Dzięki – maverick

Powiązane problemy