c++ - Statische oder dynamische Verknüpfung von CRT, MFC, ATL usw.




linker (7)

In den 90er Jahren, als ich mit MFC anfing, habe ich meine Apps dynamisch verknüpft und die relevanten MFC-DLLs ausgeliefert. Das hat mir ein paar Probleme bereitet (DLL Hell!) Und ich bin stattdessen auf statisches Linken umgestiegen - nicht nur für MFC, sondern für CRT und ATL. Anders als größere EXE-Dateien hat mir die statische Verknüpfung überhaupt keine Probleme bereitet - gibt es also irgendwelche Nachteile, die andere Leute bemerkt haben? Gibt es einen guten Grund, die dynamische Verlinkung noch einmal zu überdenken? Meine Apps sind heute hauptsächlich STL / Boost FWIW.


Answers

Eine gute Eigenschaft der Verwendung von DLLs ist, dass, wenn mehrere Prozesse die gleiche DLL lädt der Code zwischen ihnen geteilt werden kann. Dies kann Speicher sparen und die Ladezeiten verkürzen, wenn eine Anwendung eine DLL lädt, die bereits von einem anderen Programm verwendet wird.


Die meisten Antworten, die ich hier höre, beinhalten das Teilen Ihrer DLLs mit anderen Programmen oder das Aktualisieren dieser DLLs, ohne dass Ihre Software gepatcht werden muss.

Ehrlich gesagt, halte ich diese für Nachteile und nicht für Vorteile. Wenn eine Drittanbieter-DLL aktualisiert wird, kann sich diese so ändern, dass Ihre Software beschädigt wird. Und heutzutage ist der Festplattenspeicher nicht mehr so ​​kostbar, wie er einmal war, zusätzliche 500k in Ihrer ausführbaren Datei? Wen interessiert das?

  • Sich der Version von dll, die Ihre Software verwendet, 100% sicher ist, ist eine gute Sache.
  • 100% sicher zu sein, dass der Klient keine Abhängigkeit Kopfschmerzen haben wird, ist eine gute Sache.

Die Vorteile überwiegen bei weitem die Nachteile meiner Meinung nach


Es gibt einige Softwarelizenzen wie LGPL, bei denen Sie entweder eine DLL verwenden oder Ihre Anwendung als Objektdateien verteilen müssen, die der Benutzer miteinander verknüpfen kann. Wenn Sie eine solche Bibliothek verwenden, möchten Sie sie wahrscheinlich als DLL verwenden.


Ganz sicher.

Die Zuweisung erfolgt auf einem 'statischen' Heap. Da eine Zuordnungsfreigabe auf demselben Heap erfolgen sollte, bedeutet dies, dass Sie, wenn Sie eine Bibliothek p = new LibClass() , darauf achten sollten, dass der Clientcode nicht 'Ihre' p = new LibClass() und dieses Objekt selbst mit delete p; ..

Meine Schlussfolgerung: entweder Schildzuweisung und Freigabe von Client-Code, oder die CRT dynamisch verknüpfen.


Nein, nichts Neues an dieser Front. Lass es so wie es ist.


Es gibt einige Nachteile:

  • Größere exe Größe (besonders wenn Sie mehrere Exe versenden)
  • Probleme bei der Verwendung anderer DLLs, die sich auf eine dynamische Verlinkung stützen oder davon ausgehen (zB: Drittanbieter-DLLs, die Sie nicht als statische Bibliotheken erhalten können)
  • Unterschiedliche C-Laufzeiten zwischen DLLs mit unabhängiger statischer Verknüpfung (keine Cross-Modul-Zuweisung / Freigabe)
  • Keine automatische Wartung von gemeinsam genutzten Komponenten (keine Möglichkeit, dass Drittanbieter-Modulanbieter ihren Code aktualisieren, um Probleme zu beheben, ohne Ihre Anwendung neu zu kompilieren und zu aktualisieren)

Wir führen statische Verknüpfungen für unsere Windows-Anwendungen durch, vor allem weil sie die xcopy-Bereitstellung ermöglichen. Dies ist bei der Installation oder der Verwendung von SxS-DLLs nicht möglich, da der Prozess und Mechanismus nicht gut dokumentiert oder leicht zugänglich sind. Wenn Sie lokale DLLs im Installationsverzeichnis verwenden, wird es funktionieren, aber es wird nicht gut unterstützt. Die Tatsache, dass eine Remote-Installation nicht problemlos möglich ist, ohne ein MSI auf dem Remote-System zu durchlaufen, ist der Hauptgrund, warum wir keine dynamische Verknüpfung verwenden, aber (wie Sie dargelegt haben) gibt es viele andere Vorteile für die statische Verknüpfung. Es gibt Vor-und Nachteile für jeden; hoffentlich hilft das, sie aufzuzählen.


#include "wtypes.h"
#include <iostream>
using namespace std;

// Get the horizontal and vertical screen sizes in pixel
void GetDesktopResolution(int& horizontal, int& vertical)
{
   RECT desktop;
   // Get a handle to the desktop window
   const HWND hDesktop = GetDesktopWindow();
   // Get the size of screen to the variable desktop
   GetWindowRect(hDesktop, &desktop);
   // The top left corner will have coordinates (0,0)
   // and the bottom right corner will have coordinates
   // (horizontal, vertical)
   horizontal = desktop.right;
   vertical = desktop.bottom;
}

int main()
{       
   int horizontal = 0;
   int vertical = 0;
   GetDesktopResolution(horizontal, vertical);
   cout << horizontal << '\n' << vertical << '\n';
   return 0;
}

Quelle: http://cppkid.wordpress.com/2009/01/07/how-to-get-the-screen-resolution-in-pixels/





c++ mfc linker