Verweis auf DLL Datei in VS2003.net
-
was ist ein Com Wrapper und ein Interop???
-
Ein COM-Wrapper ist ein .NET-Programm welches um eine COM-DLL oder OCX gelegt wird um so eine DLL in .NET nutzbar zu machen. COM-Objekte sind etwa Steuerelemente etc. Vieles was man als reine Code-DLL machen kann kann man auch als COM machen. Das macht es halt einfacher solche Klassen in Visual Basic oder auch .NET zu importieren, weil sie ähnlich wie die .NET-DLLs viele Informationen über den Inhalt enthalten. Eine normale DLL hat nur Einsprungpunkte und der Aufrufer muss wissen wie der heisst, welche Parameter erwartet werden etc.
Eine normale DLL via Interop einbinden geht etwa so (ich mach's mal in C#, da ich C++/CLI nicht kann) (aber um das nutzen zu können wirst Du wohl noch etwas mehr Suchen/Lesen müssen):
using System.Runtime.InteropServices; public class MyDll { [DllImport("meinedll", // Name ohne ".dll" ExactSpelling = true, // sucht nicht nach meinefunktionA oder W je nach Zeichensatz CharSet = CharSet.Ansi // Strings werden als ANSI behandelt )] public static extern void meinefunktion(); };
-
WAS hast Du denn für eine DLL???
@LordJaxom: InterOp (besser gesagt P/Invoke) geht mit C++/CLI "on-the-fly"... da musst Du nix machen
-
die DLL habe ich selbst geschrieben.
woher weiss ich was für eine dll ich habe?
das einzige was ich mache, ist das exportieren/bzw importieren einer Klasse
-
gramboler schrieb:
die DLL habe ich selbst geschrieben.
woher weiss ich was für eine dll ich habe?
das einzige was ich mache, ist das exportieren/bzw importieren einer KlasseNa dann wirst Du ja auch eine passende LIB dazu haben. Sonst kannst Du mit MS VC++ keine DLL eininden, die unmanaged Klassen exportieren.
-
eine LIB????
Muss ich diese mit meinem Compiler erzeugen?
Wenn ja, dann wie geht das?Ich kann doch auch Funktionen ganz normal exportieren.
-
Wenn Du mit dem MS Complier eine DLL erzeugst und Funktionen, Daten oder Klassen expor ierst, wird per Default auch eine LIB erzeugt...
Wie erzeugst Du denn die DLL?
-
ach ja stimmt,.........sorry. Diese LIB meintest du. -> war aber auch eine dumme Frage von mir.
Diese Lib habe ich auch.
-
LordJaxom schrieb:
using System.Runtime.InteropServices; public class MyDll { [DllImport("meinedll", // Name ohne ".dll" ExactSpelling = true, // sucht nicht nach meinefunktionA oder W je nach Zeichensatz CharSet = CharSet.Ansi // Strings werden als ANSI behandelt )] public static extern void meinefunktion(); };
Wer weis wie dies in C++ geht???
-
#include <meinedll.h> #pragma comment(lib, "meinedll.lib")
-
ok, das ist aber doof, den dann muss ich alle Headerdateien der DLL miteinbinden. Wo bleibt den dann noch der Sinn einer DLL?
Und für was gibt es dann noch Verweise in Visual Studio C++ ? Was kann man damit einbinden?
Ich dachte, man kann damit DLL Dateien in das Programm einbinden, was aber bei mir nur zur bereits genannten Fehlermeldung führt.Angenommen ich wollte mit einer anderen Programmiersprache (z.B. Delphi) auf meine DLL zugreifen. Oder die DLL wäre in einer anderen Programmiersprache gschrieben. Wie müßte man dies dann mit den Headerdateien machen?
Gibt es keine Lösung bei denen man die Headerdateien nicht braucht?
-
Du kannst auch in C++/CLI P/Invoke von Hand machen... das geht dann genauso wie in C#...
using namespace System; using namespace System::Runtime::InteropServices; namespace Foo { class Bar { public: [DllImport("user32.dll")] static int MessageBox(IntPtr ^hWnd, String ^text, String ^caption, UInt32 type); }; } int main(array<System::String ^> ^args) { Foo::Bar::MessageBox(nullptr, "Hello World", "Caption", 0); return 0; }
Du kannst natürlich auch LoadLibrary und GetProcAddress verwenden...
Header-Dateien braucht Du in den obigen Fällen nicht. Auch brauchst Du keine, wenn Du eine .NET-DLL erstellst.
-
ok, ich verstehe es nicht.
Ich habe auch in der MSDN Hilfenachgelesen, aber ich verstehe nicht richtig was ich jetzt genau tun muss.
Vielleicht ist es am besten wenn ich mein eigenes Program als Beispiel nehme.
ich exportiere also eine Klasse aus meiner DLL. Das habe ich so gemacht:
class __declspec(dllexport) CBaseVideoRenderer; class __declspec(dllexport) CGetVideo: CBaseVideoRenderer
die DLL funktioniert auch, denn wenn ich, wobei wir wieder bei den Verweisen wären, auf das ganze Projekt verweise funktioniert das auch in meinem Testprogramm, ohne dass ich einen dllimport schreiben muss.
In meinem Testprogramm kann ich dann so auf Methoden der Klasse zugreifen:
c = pMyclass->Get_averageH();
Vielleicht kann mir irgendwer erklären was das mit den Verweisen auf sich hat?
Schließlich geht es in C# meines Wissens nach auch.
-
gramboler schrieb:
ich exportiere also eine Klasse aus meiner DLL. Das habe ich so gemacht:
class __declspec(dllexport) CBaseVideoRenderer; class __declspec(dllexport) CGetVideo: CBaseVideoRenderer
Klassen kannst Du nur einbinden, wenn Du eine H / LIB-Datei verwendest mit dllimport.
gramboler schrieb:
die DLL funktioniert auch, denn wenn ich, wobei wir wieder bei den Verweisen wären, auf das ganze Projekt verweise funktioniert das auch in meinem Testprogramm, ohne dass ich einen dllimport schreiben muss.
Verstehe ich nicht... wie verweist Du denn auf das "Projekt"?
gramboler schrieb:
Schließlich geht es in C# meines Wissens nach auch.
In C# kannst Du keine native C++ Klassen verwenden.
-
[quote="Jochen Kalmbach]
Verstehe ich nicht... wie verweist Du denn auf das "Projekt"?
[/quote]Ich mach das ungefähr so:
http://img333.imageshack.us/my.php?image=so1yx.jpg
In der Projektmappe gibt es einen Ordner der Verweise heißt.
Wenn man auf den mit der rechten Maustaste klick kann man einen Verweis hinzufügen.Das habe ich dann auch mit meiner DLL versucht, was aber nicht funktioniert hat.
Wenn ich aber auf das Projekt klicken das in dem Fenster zu sehen ist, dann kann ich meine DLL verweisen.Darum möchte ich auch genau wissen, auf was genau man in diesem Ordner verweisen kann.
-
Du kommst um das einbinden der DLL via LIB und h-Dateien (mit dllimport) nicht drum rum.
Siehe:
http://www.codeproject.com/dll/RegDLL.asp
-
shit..........und trotzdem Danke!!!
... das Problem dabei ist, dass ich mit einer anderen Programmiersprache auf die DLL zugreifen möchte. Wenn ich aber die Headerdateien benötige, welche natürlich in C++ geschrieben sind, wie kann ich diese dann in eine andrere Programmiersprach mit hineinnehmen.
Ist es vielleicht möglich einzelne Methoden einer Klasse zu importieren und damit quasi ein Unterprogramm zu starten, welches in der dll abläuft? Fakt ist, ich muss mit der DLL eine Webcam starten. Diese soll auch anbleiben, da sie sich jedesmal beim neueinschalten neu einrichten muss und soviel Zeit habe ich leider nicht.
Du weißt aber auch nicht, was ich bei dem Verweisen mache?
Für irgend etwas muss doch das gut dsein, sonst gäbe es dies nicht.
Das ist nun eine rein informative Frage.
-
Für alle denen es so geht wie mir:
http://www.ini-sc.net/mswin/awfcsem/kap8.htm#DLL
Hier gibt es eine ziemlich gute Beschreibung und Ereklärung, darüber was eine DLL Datei ist und was sie tut.
Was besseres habe ich bisher nicht gefunden.Leider fehlt es an einem guten Beispiel
-
Hast Du das irgendwo erwähnt, dass Du aus einer anderen Prog-Sprache zugreifen willst??? Hab ich überlesen.
Dann kannst Du sowieso nur Funktionen exportieren (und keine Klassen) und diese sollten dann die stdcall calling convention haben.
Du kannst natürlich auch einen COM-InProc-Server schreiben.