2009-07-30 11 views
8

Po pierwsze, mam na myśli środowisko Windows i kompilator VC++.Jak zaktualizować bibliotekę C++ bez konieczności ponownego łączenia pliku EXE z plikiem biblioteki?

Co mogę zrobić, to odbudować bibliotekę DLL VC++ i zachować kompatybilność z serwerem exe, który został już połączony z biblioteką bez potrzeby ponownego budowania pliku exe lub dynamicznego ładowania biblioteki dll za pomocą funkcji LoadLibrary. Innymi słowy, czy istnieje sposób dodania klas i metod do biblioteki dll (ale nie można ich usunąć) i zapewnienia, że ​​istniejące punkty początkowe pozostają takie same?

Odpowiedz

8

Jeśli wyeksportujesz funkcje z pliku DEF i ręcznie określisz liczby porządkowe, powinieneś być w stanie to zrobić.

referencyjny

http://msdn.microsoft.com/en-us/library/d91k01sh(VS.80).aspx

+5

Chciałbym dodać odniesienie http: //msdn.microsoft.com/en-us/library/900axts6(VS.80).as px To tylko jedno kliknięcie od powyższego hiperłącza i omawia powody używania plików def oraz plusy i minusy. – Rich

0

Dopóki nie doda się żadnych wyeksportowanych symboli, liczby porządkowe nie ulegną zmianie. Jeśli dodasz wyeksportowane symbole za pomocą standardowego mechanizmu dllexport, będzie to trudne do kontrolowania. Jeśli używasz starego stylu pliku .xpf, możesz kontrolować kolejność symboli w bibliotece (chociaż nie wiem tego na pewno - może nadal zmieniać ich kolejność, jak tylko się podoba), ale jest to trudne Symbole C++ w ten sposób.

0

myślę że porządkowe są rzadko stosowane do rozwiązywania import DLL więcej - myślę, że trzeba użyć .def pliki uzyskać łącznik z nich korzystać. Dopóki nie zmienisz nazw ani podpisów wyeksportowanych funkcji, plik .exe powinien działać poprawnie.

8

To zależy od tego, w jaki sposób twój EXE korzystał z klas z biblioteki DLL. Dodanie nowych klas nie powinno wpływać na istniejące punkty wejścia. Poza tym jednak jakiekolwiek z poniższych będzie miało wpływ na rozmiar i/lub układ obiektu i jako takie będzie zmiana łamania klienta (zauważ, że jest to technicznie specyficzne dla VC, ale większość z nich odnosi się do jakiejkolwiek rozsądnej implementacji):

  • Usuwanie pola (nawet prywatnych) z klas
  • Dodawanie nowych pól (nawet prywatnych) do klas
  • dodawanie nowych klas bazowych do istniejących klas
  • Usuwanie klas bazowych z istniejących klas
  • Dodanie nowego wirtualnego metoda przed istniejąca metoda wirtualna (dodanie nowych metod wirtualnych po istniejących jest prawidłowe, z wyjątkiem przypadku opisanego w następnym punkcie)
  • Dodanie nowej metody wirtualnej w klasie, która jest używana jako klasa podstawowa przez inną klasę w tej samej bibliotece DLL, która ma również metody wirtualne
  • typ Zmiana istniejących pól
  • Zmiana podpisu istniejących metod
  • dokonywania metoda wirtualna nie wirtualny, a odwrotnie
+0

Myślę, że jest to dobra odpowiedź, ale zmieniłbym jedną rzecz: zmiana wirtualnych metod w klasie w jakikolwiek sposób byłaby podejrzana. Nie sądzę, że można liczyć na vtable, aby funkcje wirtualne były w takiej kolejności, w jakiej są wyświetlane w pliku źródłowym. –

+0

Co najmniej w wersji VC, możesz na to liczyć - jest to warunek wstępny do obsługi COM (która wymaga określonego porządku vtable). –

+0

Świetna odpowiedź Pavel, ja tylko zastanawiam się, czy mógłbyś dodać kilka odniesień, aby poprzeć twoje twierdzenia. Dziękuję Ci! –

Powiązane problemy