R
Hallo,
die im Beitrag von gestern beschriebe SplashScreen-DLL rufe ich in der Fkt. main vor der eigentlichen Anwendung auf. CncWork30 heißen sowohl die .exe als auch der Namensraum, in dem auch CncChild (eine MDI-Child-Klasse) deklariert und definiert wird. Hier ist das erste "Stück" der Headerdatei von CncChild:
#pragma once
#pragma comment(lib ,"Test_Dll.lib")
#include "D:\\A_VC_NET_Projects\\Projects\\CncWrk30\\DLLs\\GLRender\\GLRender.h"
#include "D:\\A_VC_NET_Projects\\Projects\\CncWrk30\\DLLs\\Test_Dll\\Test_Dll.h"
using namespace System;
using namespace System::ComponentModel;
using namespace System::Collections;
using namespace System::Windows::Forms;
using namespace System::Data;
using namespace System::Drawing;
using namespace GLRender;
//using namespace CNC_Edit;
namespace CncWrk30 {
/// <summary>
/// Zusammenfassung für CncChild
///
/// Warnung: Wenn Sie den Namen dieser Klasse ändern, müssen Sie auch
/// die Ressourcendateiname-Eigenschaft für das Tool zur Kompilierung verwalteter Ressourcen ändern,
/// das allen RESX-Dateien zugewiesen ist, von denen diese Klasse abhängt.
/// Anderenfalls können die Designer nicht korrekt mit den lokalisierten Ressourcen
/// arbeiten, die diesem Formular zugewiesen sind.
/// </summary>
public ref class CncChild : public System::Windows::Forms::Form
{
public:
CncChild(void)
{
first = true;
InitializeComponent();
//
//TODO: Konstruktorcode hier hinzufügen.
//
GLContext = gcnew GL3DCNCContext((HWND)this->splitContainer1->Panel2->Handle.ToPointer(),
(HFONT)this->splitContainer1->Panel2->Font->ToHfont().ToPointer(),
this->splitContainer1->Panel2->Width,
this->splitContainer1->Panel2->Height);
first = false;
GLContext->RenderScene(); // Szene darstellen
fnTest_Dll();
}
protected:
/// <summary>
/// Verwendete Ressourcen bereinigen.
/// </summary>
~CncChild()
{
if (components)
{
delete components;
}
}
private:
GL3DCNCContext ^GLContext;
bool first;
private: System::Windows::Forms::SplitContainer^ splitContainer1;
private: System::Windows::Forms::Button^ Cancel_Btn;
.
.
.
Dann habe ich mit dem VC 2005 gestern noch eine Test-DLL erstellt und versucht diese einzubinden (Zeile 5 im obigen Listing). Aus der DLL werden je eine Variable, eine Fkt und eine Klasse exportiert. Das habe ich so bei der Erstellung der DLL durch den Anwendungsassi generieren lassen (Falls das jemand nachvollziehen will: mit Datei/Neu.../Projekt/Win32/Konsolenanwendung ->Namen eingeben; dann auf "OK"; im nächsten Dialogfeld auf "Weiter"; bei "Anwendungstyp" "DLL" auswählen und die Option "Symbole exportieren" wählen und auf "Fertig stellen" klicken). Ich versuche nun die exportierte Fkt fnTest_DLL() in Zeile 45 aufzurufen. Beim Übersetzen und Linken der DLL gibt es keine Beanstandungen - noch nicht! Danach wird aber die .exe erzeugt. Das Ganze wird von Compiler und Linker wie folgt quittiert:
------ Neues Erstellen gestartet: Projekt: Test_Dll, Konfiguration: Debug Win32 ------
Die Zwischen- und Ausgabedateien für das Projekt "Test_Dll" mit der Konfiguration "Debug|Win32" werden gelöscht.
Kompilieren...
stdafx.cpp
Kompilieren...
Test_Dll.cpp
Manifest in Ressourcen wird kompiliert...
Verknüpfen...
Bibliothek "d:\A_VC_NET_Projects\Projects\CncWrk30\CncWrk30\Debug\Test_Dll.lib" und Objekt "d:\A_VC_NET_Projects\Projects\CncWrk30\CncWrk30\Debug\Test_Dll.exp" werden erstellt.
Das Manifest wird eingebettet...
Das Buildprotokoll wurde unter "file://d:\A_VC_NET_Projects\Projects\CncWrk30\DLLs\Test_Dll\Debug\BuildLog.htm" gespeichert.
Test_Dll - 0 Fehler, 0 Warnung(en)
------ Neues Erstellen gestartet: Projekt: CncWrk30, Konfiguration: Debug Win32 ------
Die Zwischen- und Ausgabedateien für das Projekt "CncWrk30" mit der Konfiguration "Debug|Win32" werden gelöscht.
Kompilieren...
stdafx.cpp
Kompilieren...
CncWrk30.cpp
D:\\A_VC_NET_Projects\\Projects\\CncWrk30\\DLLs\\Test_Dll\\Test_Dll.h(17) : warning C4272: "CTest_Dll::CTest_Dll": Ist als __declspec(dllimport) markiert. Beim Importieren einer Funktion muss eine systemeigene Aufrufkonvention angegeben werden.
D:\\A_VC_NET_Projects\\Projects\\CncWrk30\\DLLs\\Test_Dll\\Test_Dll.h(19) : warning C4272: "CTest_Dll::~CTest_Dll": Ist als __declspec(dllimport) markiert. Beim Importieren einer Funktion muss eine systemeigene Aufrufkonvention angegeben werden.
D:\\A_VC_NET_Projects\\Projects\\CncWrk30\\DLLs\\Test_Dll\\Test_Dll.h(19) : warning C4272: "CTest_Dll::CTest_Dll": Ist als __declspec(dllimport) markiert. Beim Importieren einer Funktion muss eine systemeigene Aufrufkonvention angegeben werden.
D:\\A_VC_NET_Projects\\Projects\\CncWrk30\\DLLs\\Test_Dll\\Test_Dll.h(19) : warning C4272: "CTest_Dll::operator =": Ist als __declspec(dllimport) markiert. Beim Importieren einer Funktion muss eine systemeigene Aufrufkonvention angegeben werden.
D:\\A_VC_NET_Projects\\Projects\\CncWrk30\\DLLs\\Test_Dll\\Test_Dll.h(21) : warning C4394: "nTest_Dll": Ein anwendungsdomänenspezifisches Symbol sollte nicht mit __declspec(dllimport) markiert werden.
D:\\A_VC_NET_Projects\\Projects\\CncWrk30\\DLLs\\Test_Dll\\Test_Dll.h(23) : warning C4272: "fnTest_Dll": Ist als __declspec(dllimport) markiert. Beim Importieren einer Funktion muss eine systemeigene Aufrufkonvention angegeben werden.
CncChild.cpp
D:\\A_VC_NET_Projects\\Projects\\CncWrk30\\DLLs\\Test_Dll\\Test_Dll.h(17) : warning C4272: "CTest_Dll::CTest_Dll": Ist als __declspec(dllimport) markiert. Beim Importieren einer Funktion muss eine systemeigene Aufrufkonvention angegeben werden.
D:\\A_VC_NET_Projects\\Projects\\CncWrk30\\DLLs\\Test_Dll\\Test_Dll.h(19) : warning C4272: "CTest_Dll::~CTest_Dll": Ist als __declspec(dllimport) markiert. Beim Importieren einer Funktion muss eine systemeigene Aufrufkonvention angegeben werden.
D:\\A_VC_NET_Projects\\Projects\\CncWrk30\\DLLs\\Test_Dll\\Test_Dll.h(19) : warning C4272: "CTest_Dll::CTest_Dll": Ist als __declspec(dllimport) markiert. Beim Importieren einer Funktion muss eine systemeigene Aufrufkonvention angegeben werden.
D:\\A_VC_NET_Projects\\Projects\\CncWrk30\\DLLs\\Test_Dll\\Test_Dll.h(19) : warning C4272: "CTest_Dll::operator =": Ist als __declspec(dllimport) markiert. Beim Importieren einer Funktion muss eine systemeigene Aufrufkonvention angegeben werden.
D:\\A_VC_NET_Projects\\Projects\\CncWrk30\\DLLs\\Test_Dll\\Test_Dll.h(21) : warning C4394: "nTest_Dll": Ein anwendungsdomänenspezifisches Symbol sollte nicht mit __declspec(dllimport) markiert werden.
D:\\A_VC_NET_Projects\\Projects\\CncWrk30\\DLLs\\Test_Dll\\Test_Dll.h(23) : warning C4272: "fnTest_Dll": Ist als __declspec(dllimport) markiert. Beim Importieren einer Funktion muss eine systemeigene Aufrufkonvention angegeben werden.
AssemblyInfo.cpp
AboutBox.cpp
Code wird generiert...
Verwaltete Ressourcen werden kompiliert...
Liest in den 29-Ressourcen von "d:\A_VC_NET_Projects\Projects\CncWrk30\CncWrk30\Form1.resx".
Ressourcendatei wird geschrieben... Fertig.
Liest in den 11-Ressourcen von "d:\A_VC_NET_Projects\Projects\CncWrk30\CncWrk30\CncChild.resx".
Ressourcendatei wird geschrieben... Fertig.
Liest in den 3-Ressourcen von "d:\A_VC_NET_Projects\Projects\CncWrk30\CncWrk30\AboutBox.resx".
Ressourcendatei wird geschrieben... Fertig.
Ressourcen werden kompiliert...
Verknüpfen...
CncWrk30.obj : error LNK2028: Nicht aufgelöstes Token (0A00007E) ""int __clrcall fnTest_Dll(void)" (?fnTest_Dll@@$$FYMHXZ)", auf das in Funktion ""public: __clrcall CncWrk30::CncChild::CncChild(void)" (??0CncChild@CncWrk30@@$$FQAAM@XZ)" verwiesen wird.
CncChild.obj : error LNK2028: Nicht aufgelöstes Token (0A000052) ""int \_\_clrcall fnTest\_Dll(void)" (?fnTest\_Dll@@FYMHXZ)",aufdasinFunktion""public:__clrcallCncWrk30::CncChild::CncChild(void)"(??0CncChild@CncWrk30@@FYMHXZ)", auf das in Funktion ""public: \_\_clrcall CncWrk30::CncChild::CncChild(void)" (??0CncChild@CncWrk30@@FYMHXZ)",aufdasinFunktion""public:__clrcallCncWrk30::CncChild::CncChild(void)"(??0CncChild@CncWrk30@@FQFQFQAAM@XZ)" verwiesen wird.
CncChild.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol ""int __clrcall fnTest_Dll(void)" (?fnTest_Dll@@$$FYMHXZ)" in Funktion ""public: __clrcall CncWrk30::CncChild::CncChild(void)" (??0CncChild@CncWrk30@@$$FQAAM@XZ)".
CncWrk30.obj : error LNK2001: Nicht aufgelöstes externes Symbol ""int \_\_clrcall fnTest\_Dll(void)" (?fnTest_Dll@@$FYMHXZ)".
D:\A_VC_NET_Projects\Projects\CncWrk30\CncWrk30\Debug\CncWrk30.exe : fatal error LNK1120: 3 nicht aufgelöste externe Verweise.
Das Buildprotokoll wurde unter "file://d:\A_VC_NET_Projects\Projects\CncWrk30\CncWrk30\Debug\BuildLog.htm" gespeichert.
CncWrk30 - 5 Fehler, 12 Warnung(en)
Wenn ich die DLL so erstelle, wird auch eine Importbibliothek erzeugt. Diese versuche ich in das .exe-Projekt mit einzubinden (Zeile 2).
Das Einbinden der bereits "fertigen DLL" (siehe meinen Beitrag hier vom 07.11. morgens beginnend mit "Auweia,") wollte ich über deren Hauptheader realisieren (Zeile 4). Das ist die DLL, die ich getrost löschen kann, da die gesamte Implementierung in den Headern erfolgte und folglich auch OHNE DLL von der .exe genutzt werden kann. Einen meiner Renderingkontexte aus dieser "DLL" habe ich als privaten Zeiger in CncChild angelegt (Zeile 61). Diesen Zeiger initialisiere ich im Konstruktor von CncChild (Zeile 38) und zeichne auch gleich die Szene (Zeile 43). Aber das ist ja ohnehin der falsche Weg, mit DLLs zu arbeiten.
Gruß RastowMax