DLLScreenCap-Beispiel: Demonstriert eine reguläre DLL, die eine statische oder dynamische Verknüpfung zu MFC herstellt
Aktualisiert: November 2007
Das DLLScreenCap-Beispiel erläutert eine DLL-Version (Dynamic Link Library-Version) eines Bildschirmerfassungstools. DLLScreenCap ersetzt das veraltete DLLTRACE-Beispiel. DLLTRACE wurde in MDC 1.0 vorgestellt, um das Schreiben einer DLL zu veranschaulichen, die selbst statisch mit der MFC-Bibliothek verknüpft ist. DLLScreenCap stellt eine C-basierte Programmschnittstelle zu der auf Microsoft Windows basierenden Anwendung bereit, mit der sie dynamisch verknüpft ist. Eine statisch mit der MFC-Bibliothek verknüpfte DLL kann Memberfunktionen von Klassen, die von MFC-Klassen abgeleitet wurden, nicht erfolgreich exportieren.
Das Verfahren zum statischen Verknüpfen einer DLL mit der MFC-Bibliothek wird unter Technischer Hinweis 11: Using MFC as Part of a DLL (nur auf Englisch verfügbar) erläutert. Das DLLScreenCap-Beispiel kann auch dynamisch mit MFC verknüpft werden, ohne dass es sich dabei um eine Erweiterungs-DLL handelt. Bevor Sie eine benutzerdefinierte DLL durch eine statische Verknüpfung mit MFC implementieren, sollten Sie versuchen, diese als MFC-Erweiterungs-DLL zu implementieren (siehe Erläuterung unter Technischer Hinweis 33: DLL Version of MFC (nur auf Englisch verfügbar) und im DLLHUSK-Beispiel).
Eine mit der MFC-Bibliothek verknüpfte DLL, bei der es sich nicht um eine Erweiterungs-DLL handelt, muss über eine von CWinApp abgeleitete Klasse und ein einzelnes Objekt dieser Anwendungsklasse verfügen, wie dies z. B. bei ausführbaren MFC-Anwendungen der Fall ist. Im Gegensatz zum CWinApp-Objekt einer Anwendung besitzt das CWinApp-Objekt der DLL jedoch kein Hauptmeldungssystem. Wenn die DLL nicht modale Dialogfelder öffnet oder ein eigenes Hauptrahmenfenster besitzt, dann muss die Haupt-Meldungsverteilschleife der Anwendung eine von der DLL exportierte Routine aufrufen, die wiederum die Memberfunktion CWinApp::PreTranslateMessage des DLL-Anwendungsobjekts aufruft. Dies veranschaulicht die durch DLLScreenCap.dll exportierte FilterDllMsg-Funktion.
ScreenCapApi.h zeigt, dass das Deklarieren von Funktionen mit extern "C" eine Möglichkeit ist, Clientanwendungen eine DLL-Schnittstelle zur Verfügung zu stellen. Die Verwendung von extern "C" bietet einige Vorteile. Zunächst ist die DLL damit auch für Nicht-C++-Clientanwendungen verwendbar. Des Weiteren wird der DLL-Verarbeitungsaufwand reduziert, da die C++-Namensergänzung nicht auf den exportierten Namen angewendet wird. Schließlich wird es einfacher, einer DEF-Datei Elemente explizit hinzuzufügen (zum Exportieren nach Ordnungszahl), ohne dabei die C++-Namensergänzung beachten zu müssen.
Sicherheitshinweis: |
---|
Dieser Beispielcode dient dazu, ein Konzept zu veranschaulichen. Er sollte nicht für Anwendungen oder Websites verwendet werden, da dieser Code unter Umständen nicht die sicherste Codierungstechnik darstellt. Microsoft übernimmt keine Haftung für beiläufig entstandene Schäden oder Folgeschäden, falls der Beispielcode nicht bestimmungsgemäß verwendet wird. |
So rufen Sie Beispiele und Anweisungen für ihre Installation ab
Klicken Sie in Visual Studio im Menü Hilfe auf Beispiele.
Weitere Informationen finden Sie unter Suchen von Beispieldateien.
Die neueste Version und vollständige Liste mit Beispielen ist online unter Visual Studio 2008 Samples verfügbar.
Sie können auch Beispiele auf der Festplatte des Computers suchen. Standardmäßig werden Beispiele und eine Infodatei in einen Ordner unter \Programme\Visual Studio 9.0\Samples\ kopiert. Für Express Editions von Visual Studio sind alle Beispiele online verfügbar.
Erstellen und Ausführen des Beispiels
Das DLLScreenCap-Beispiel besteht aus zwei Projekten: DLLScreenCap, einem DLL-Projekt, und ScreenCap, einem EXE-Projekt, das innerhalb der DLL Aufrufe vornimmt.
Durch die Erstellung von ScreenCap aus der bereitgestellten Projektmappe wird automatisch DLLScreenCap erstellt und die DLL in das Ausgabeverzeichnis von ScreenCap kopiert.
Hinweis Da dieses Beispiel einen benutzerdefinierten Buildschritt für das Kopieren einer Datei verwendet, sollten Sie die Projektmappe nicht mithilfe des UNC-Pfads öffnen. Speichern Sie die Beispieldateien in einem Verzeichnis mit einem Laufwerkbuchstaben.
So erstellen Sie das DLLScreenCap-Beispiel und führen es aus
Öffnen Sie die Projektmappe DllScreenCap.sln.
Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf den Projektordner ScreenCap, und klicken Sie im Kontextmenü auf Als Startprojekt festlegen.
Klicken Sie im Menü Erstellen auf Erstellen.
Klicken Sie im Menü Debuggen auf Starten ohne Debuggen.
Das ScreenCap-Fenster zeigt den letzten nach der Skalierung auf Fenstergröße erfassten Bildschirm an. Klicken Sie im Menü File auf Configure Screen Capture. Daraufhin wird ein Dialogfeld geöffnet, in dem Sie angeben können, ob der Bildschirm oder das aktive Fenster erfasst werden soll. Außerdem können Sie den Pfad angeben, in dem die erfasste Datei gespeichert werden soll. Klicken Sie zum Erstellen einer Datei des erfassten Bildschirms und zur Aktualisierung der Clientfensteranzeige auf Screen Capture.
Konvertieren von DLLScreenCap, sodass eine dynamische Verknüpfung mit MFC DLL hergestellt wird
DLLScreenCap erläutert die Erstellung einer regulären DLL mit einer exportierten Funktion, die zum Anzeigen eines modalen Dialogfelds aufgerufen werden kann. In früheren Versionen von Visual C++ war dies die einzige verfügbare Option für reguläre DLLs. Diese DLL-Arten wurden früher als _USRDLLs bezeichnet.
Jetzt ist es möglich, dass reguläre DLLs MFC aus der gemeinsam genutzten MFCx0 DLL verwenden. Aufgrund des Potentials zur Größenreduktion der Build können Sie das DLLScreenCap-Beispiel auch mithilfe der gemeinsam genutzten MFC-DLL erstellen. Durch die Unterstützung der gemeinsam genutzten Bibliothek in DLLScreenCap.dll wird die Größe der DLL des Releasebuilds von über 100 KB auf etwa 16 KB reduziert und die Größe des Debugbuilds von über einem 1 MB auf 100 KB. Verwenden Sie zum korrekten Umschalten des globalen MFC-Modulzustands das Makro AFX_MANAGE_STATE, wenn Sie dynamisches Verknüpfen in DLLScreenCap unterstützen möchten.
So stellen Sie sicher, dass DLLScreenCap in einer gemeinsam genutzten Bibliothek verwendet werden kann
Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf den Projektknoten ScreenCap, und klicken Sie im Kontextmenü auf Eigenschaften.
Das Dialogfeld Eigenschaftenseiten wird angezeigt.
Wählen Sie im Dropdownmenü Konfiguration die Option Mehrere Konfigurationen aus. Weitere Informationen zum Dialogfeld Eigenschaftenseiten finden Sie unter Festlegen von Visual C++-Projekteigenschaften.
Wählen Sie sowohl das Release- als auch das Debugbuild aus, um deren Einstellungen zu ändern.
Stellen Sie sicher, dass auf der Eigenschaftenseite "Allgemein" des Projekts die Eigenschaft Verwendung von MFC zur Verwendung von MFC in einer gemeinsam genutzten DLL aktiviert ist.
Stellen Sie sicher, dass sich am Beginn der aus der DLL exportierten Funktion jeweils die folgende Codezeile befindet (nähere Erläuterungen dazu siehe Verwalten der Statusdaten von MFC-Modulen):
AFX_MANAGE_STATE(AfxGetStaticModuleState())
DllScreenCap.dll exportiert beispielsweise vier Funktionen:
CaptureScreen
ConfigureCapture
ProcessDLLIdle
FilterDLLMsg
FilterDLLMsg sollte in der konvertierten Form folgendermaßen aussehen:
BOOL WINAPI FilterDllMsg(LPMSG lpMsg)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState())
TRY
{
return AfxGetApp()->PreTranslateMessage(lpMsg);
}
END_TRY
return FALSE;
}
Schlüsselwörter
Dieses Beispiel demonstriert die Verwendung der folgenden Schlüsselwörter:
CDialog::DoModal, CWinApp::InitInstance, CWinApp::OnIdle, CWinApp::PreTranslateMessage, CWnd::DoDataExchange, CWnd::GetClientRect, CWnd::OnPaint, ShowWindow, UpdateWindow, CImage, AFX_MANAGE_STATE, AfxGetStaticModuleState, CWnd::GetDesktopWindow, CWnd::GetActiveWindow, CImage::Create, CImageDC, CImage::Save, SHBrowseForFolder, CImage::Load, CDC::SetStretchBltMode, CImage::StretchBlt, CWnd::OnEraseBkgnd, CWindowDC