Selbst erstellte unmanaged Dll
-
...den Code habe ich schon, ich versuche ja selber eine DLL zu erstellen. Auf meine DLL sollen später mehrere Anwendungen zugreifen können.
Das mit extern "C" funktioniert irgendwie nicht, ich bekomme Fehlermeldung:
**syntax error : 'string'
unexpected token(s) preceding ';'**
muss ich noch 'was includieren.ich weiss nicht genau, wie ich unmanaged funktionen in ein managed Projekt importieren kann.
btw: ich habe das auch noch nie gemacht, hab echt keine Ahnung.... ich bin dankbar für Vorschläge jeglicher Art...
-
muss ich die DLL bei besagter Application als Verweis hinzufügen.
hat keiner ne Idee, was ich falsch mache...?
-
In C++(/CLI) brauchst Du kein DllImport....
Du kannst einfach die LIB der DLL Deinem projekt hinzufügen, die H-Datei includieren und die Funktion aufrufen.
-
Hallo,
ich habe da ein ähnliches Problem. Nachdem ich mir einen Webcast angesehen hatte, kriege ich das genauso einfach nicht compiliert. Liegt vielleicht daran, dass der Webcast alt ist.
#include <windows.h> #using <mscorlib.dll> #include <tchar.h> using namespace System; using namespace System::Runtime::InteropServices; ... String^ s1 = gcnew String("Hello"); String^ s2 = gcnew String("World"); char* st1 = static_cast<char*>(System::Runtime::InteropServices::Marshal::StringToHGlobalUni(s1).ToPointer()); char* st2 = static_cast<char*>(System::Runtime::InteropServices::Marshal::StringToHGlobalUni(s2).ToPointer()); MessageBox(0, st1, st2, 0); ...
gibt
Fehler 1 error C2664: 'MessageBox': Konvertierung des Parameters 2 von 'char *' in 'LPCTSTR' nicht möglich
Konvertiere ich dann noch in (LPCTSTR) bzw. LPCWSTR, dann bekomme ich die Meldung weiter unten.
Eigentlich müsste es ja so auch einfacher funktionieren:#include "stdafx.h" #include <windows.h> #include <tchar.h> #using <mscorlib.dll> using namespace System; using namespace System::Runtime::InteropServices; int main(array<System::String ^> ^args) { char* st1 = "Hello"; char* st2 = "World"; MessageBox(0, (LPCWSTR)st1, (LPCWSTR)st2, 0); return 0; }
Aber es kommt dieser Fehler:
Fehler 1 error LNK2028: Nicht aufgelöstes Token (0A00002C) ""extern "C" int __stdcall MessageBoxW(struct HWND__ *,wchar_t const *,wchar_t const *,unsigned int)" (?MessageBoxW@@$$J216YGHPAUHWND__@@PB_W1I@Z)", auf das in Funktion ""extern "C" int __cdecl MessageBox(struct HWND__ *,wchar_t const *,wchar_t const *,unsigned int)" (?MessageBox@@$$J0YAHPAUHWND__@@PB_W1I@Z)" verwiesen wird. Interoping.obj
Fehler 2 error LNK2019: Verweis auf nicht aufgelöstes externes Symbol ""extern "C" int __stdcall MessageBoxW(struct HWND__ *,wchar_t const *,wchar_t const *,unsigned int)" (?MessageBoxW@@$$J216YGHPAUHWND__@@PB_W1I@Z)" in Funktion ""extern "C" int __cdecl MessageBox(struct HWND__ *,wchar_t const *,wchar_t const *,unsigned int)" (?MessageBox@@$$J0YAHPAUHWND__@@PB_W1I@Z)". Interoping.objHier A rational attempt to substantiate C++/CLI as a first class CLI language
habe ich gelesen, dass man Marshalling in den meisten Fällen nicht benötigt.Ich hoffe, jemand kann hier helfen.
-
Also ich will einfach nur auf einige WinAPI .dll zugreifen können, habe aber nichts gefunden um den Fehler zu beheben. Ich bin leider auch nicht sonderlich bewandert in der Windows API respektive VS2005 + Win32.
-
Du musst die libs dazu linken. Das machst du mit den Projekteinstellungen unter Linker/Input/Additional Dependencies. Nun weiss ich zwar nicht, welche libs du genau brauchst, aber es sollte eine der folgenden (win32-standard libs) sein:
kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib
Alternativ kannst du auch direkt vom Code aus eine lib einbinden:
#pragma comment (lib, "kernel32.lib")
-
Danke sehr
Das hier hatte ich schon versucht, aber nur mit .dll und nicht mit .lib
Alternativ kannst du auch direkt vom Code aus eine lib einbinden:
C/C++ Code:
#pragma comment (lib, "kernel32.lib")Funktioniert so immer noch nicht. Da muss ich wohl noch die nötige lib finden.
Aber...
Der Hinweis zu den zusätzlichen Abhängigkeiten hat geholfen Witzigerweise steht da "noinherit", obwohl alle Abhängigkeiten schon im Auswahlfenster stehen. Also genügte ein Klick auf "Vom übergeordneten Projekt erben oder Projektstandard" und es geht.
Vielen Dank nochmal.
Und jetzt schaue ich einmal, warum ich die Ausgabe nun auf Chinesisch habe.
-
Ah verstanden.
Ich hatte Unicode und Ansi vermischt. Daher Chinesische Zeichen.
-
Noch eine kleine Frage hätte ich.
#using <mscorlib.dll>
scheint nicht nötig zu sein. Es funktioniert auch ohne, aber im Webcast wurde die als wichtig mit hinein genommen. War die einmal nötig und ist es jetzt nicht mehr?
Ich frage, weil ich noch ein Problem habe. Namentlich das Freigeben der Resourcen.
void MsgBox(String^ Text) { char* st1 = static_cast<char*>(Marshal::StringToHGlobalAnsi(Text).ToPointer()); char* st2 = "Interop"; MessageBoxA(0, st1, st2, 0); Marshal::FreeHGlobal(st1); // sollte so funktionieren Marshal::FreeHGlobal(st2); // sollte wohl nicht funktionieren, da kein Handle durch Marshal
Es kommt in jedem Fall der Fehler
Fehler 1 error C2664: 'System::Runtime::InteropServices::Marshal::FreeHGlobal': Konvertierung des Parameters 1 von 'char *' in 'System::IntPtr' nicht möglich
und ein cast hilft da nicht weiter sondern bringt nur eine Reihe wirklich kryptischer Ausnahmen quer durch die WinAPI.
Ein klassisches delete funktioniert leider auch nicht.Ich finde darüber nichts im Netz. Nur c# Sachen oder eben vereinzelte Erklärungen aus der Managed Extensions Zeit. Es wäre schön, wenn hier jemand wissen würde, wie das geht.
-
IntPtr hat einen Konstruktor, welcher void * nimmt. Mach also ein System::IntPtr(st1) daraus und es sollte funktionieren.
-
Jetzt wollte ich schon schreiben, dass ich das schon versucht hatte und es einen Fehler gab. Glücklicherweise hab ich das vorher noch einmal überprüft. Funktioniert wunderbar so.
Ich hatte das wohl versucht, als ich st1 (so wie st2) ohne Marshal direkt erstellt hatte. Da gab es dann einen Fehler.
Vielen Dank