Verweis auf DLL Datei in VS2003.net
-
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.