c++ code in vc++ übernehmen
-
Moin,
also erstmal ich bin gerade erst neu in c++ und möchte mir ein Wrapper für eine DLL schreiben. Zu dieser DLL gibt es ein c++ Beispiel projekt, welches ich bereits erfolgreich mit Dev-C++ getestet habe.
#include <stdio.h> #include <windows.h> #include <iostream> #include <string> using namespace std; // types for library functions typedef char TSERIAL[16]; typedef TSERIAL TSERIALLIST[32]; typedef void (STDCALL* THOSTDEVICECHANGEPROC) (void); // define library functions typedef void (STDCALL* TGetAllConnectedInterfaces) (TSERIALLIST* SerialList); TGetAllConnectedInterfaces GetAllConnectedInterfaces; int main(int argc, char *argv[]) { HINSTANCE dll_handle = LoadLibrary("usbdmx.dll"); // Get library function addresses GetAllConnectedInterfaces = (TGetAllConnectedInterfaces)GetProcAddress(dll_handle, "GetAllConnectedInterfaces"); // "InterfaceList" is filled by "GetAllConnectedInterfaces" or "GetAllOpenedInterfaces" // It contains the serials of up to 32 connected interfaces. A serial (16 characters) is // an array of char with a fixed length of 16, it is not a null terminated string (there is no null-termination) TSERIALLIST InterfaceList; // Here you get the list of all connected interfaces. If the value (serial) of "0000000000000000" occurs in the list then there are no more interfaces connected GetAllConnectedInterfaces(&InterfaceList); int n,m; std::string Serial(""); for(n=0;n<=31;n++) { for(m=0;m<=15;m++) { Serial += InterfaceList[n][m]; } if(Serial != "0000000000000000") cout << Serial << "\n"; Serial = ""; } system("PAUSE"); FreeLibrary(dll_handle); return 0; }
Diesen Code habe ich nun in VC++ eingefügt, aber beim Kompilieren werden mir einige Fehler ausgegeben:
e:\vs++_data\vbtest\vbtest.h(15) : error C2143: Syntaxfehler: Es fehlt ')' vor '*' e:\vs++_data\vbtest\vbtest.h(15) : error C2143: Syntaxfehler: Es fehlt ';' vor '*' e:\vs++_data\vbtest\vbtest.h(15) : error C2059: Syntaxfehler: ')' e:\vs++_data\vbtest\vbtest.h(15) : error C4430: Fehlender Typspezifizierer - int wird angenommen. Hinweis: "default-int" wird von C++ nicht unterstützt. e:\vs++_data\vbtest\vbtest.h(15) : warning C4183: 'THOSTDEVICECHANGEPROC': Rückgabetyp fehlt; Memberfunktion, die 'int' zurückgibt wird angenommen e:\vs++_data\vbtest\vbtest.h(18) : error C2143: Syntaxfehler: Es fehlt ')' vor '*' e:\vs++_data\vbtest\vbtest.h(18) : error C2143: Syntaxfehler: Es fehlt ';' vor '*' e:\vs++_data\vbtest\vbtest.h(18) : error C2059: Syntaxfehler: ')' e:\vs++_data\vbtest\vbtest.h(18) : error C4430: Fehlender Typspezifizierer - int wird angenommen. Hinweis: "default-int" wird von C++ nicht unterstützt. e:\vs++_data\vbtest\vbtest.h(18) : warning C4183: 'TGetAllConnectedInterfaces': Rückgabetyp fehlt; Memberfunktion, die 'int' zurückgibt wird angenommen e:\vs++_data\vbtest\vbtest.h(19) : error C2146: Syntaxfehler: Fehlendes ';' vor Bezeichner 'GetAllConnectedInterfaces' e:\vs++_data\vbtest\vbtest.h(19) : error C4430: Fehlender Typspezifizierer - int wird angenommen. Hinweis: "default-int" wird von C++ nicht unterstützt. e:\vs++_data\vbtest\vbtest.h(19) : error C4430: Fehlender Typspezifizierer - int wird angenommen. Hinweis: "default-int" wird von C++ nicht unterstützt. e:\vs++_data\vbtest\vbtest.h(30) : error C2090: Funktionsergebnis ist ein Array e:\vs++_data\vbtest\vbtest.h(23) : error C2065: 'HINSTANCE': nichtdeklarierter Bezeichner e:\vs++_data\vbtest\vbtest.h(23) : error C2146: Syntaxfehler: Fehlendes ';' vor Bezeichner 'dll_handle' e:\vs++_data\vbtest\vbtest.h(23) : error C2065: 'dll_handle': nichtdeklarierter Bezeichner e:\vs++_data\vbtest\vbtest.h(23) : error C3861: "LoadLibrary": Bezeichner wurde nicht gefunden. e:\vs++_data\vbtest\vbtest.h(26) : error C2065: 'GetAllConnectedInterfaces': nichtdeklarierter Bezeichner e:\vs++_data\vbtest\vbtest.h(26) : error C2146: Syntaxfehler: Fehlendes ';' vor Bezeichner 'GetProcAddress' e:\vs++_data\vbtest\vbtest.h(26) : error C2065: 'dll_handle': nichtdeklarierter Bezeichner e:\vs++_data\vbtest\vbtest.h(26) : error C3861: "GetProcAddress": Bezeichner wurde nicht gefunden. e:\vs++_data\vbtest\vbtest.h(33) : error C3861: "GetAllConnectedInterfaces": Bezeichner wurde nicht gefunden. e:\vs++_data\vbtest\vbtest.h(35) : warning C4172: Adresse einer lokalen Variablen oder eines temporären Werts wird zurückgegeben
und der dazugehörige VC++ Code:
// vbtest.h #include "stdafx.h" #pragma once using namespace System; namespace usbdmx { public ref class wrapper { // types for library functions typedef unsigned char TDMXArray[512]; typedef char TSERIAL[15]; typedef TSERIAL TSERIALLIST[31]; typedef void (STDCALL* THOSTDEVICECHANGEPROC) (void); // define library functions typedef void (STDCALL* TGetAllConnectedInterfaces) (TSERIALLIST* SerialList); TGetAllConnectedInterfaces GetAllConnectedInterfaces; int main(array<System::String ^> ^args) { HINSTANCE dll_handle = LoadLibrary("usbdmx.dll"); // Get library function addresses GetAllConnectedInterfaces = (TGetAllConnectedInterfaces)GetProcAddress(dll_handle, "GetAllConnectedInterfaces"); } public: TSERIALLIST GetAllInterfaces() { TSERIALLIST InterfaceList; GetAllConnectedInterfaces(&InterfaceList); return InterfaceList; } }; }
Ich hoffe ihr könnt damit was anfangen und mir helfen! Vielen Dank
-
Hallo,
dein Code passt nicht in dieses Forum, du programmierst C++/CLI, hier geht's um die MFC, die mit ("purem") C++ verwendet wird. Trotzdem ein Hinweis: ohne Einbindung der passenden ".h"-Dateien (ich weiss nicht, was stdafx.h bei dir einbindet) wird das nichts werden.
MfG,
Probe-Nutzer
-
Achso, nun ich dachte, weil hier Visual C++ steht und das habe ich in sonst keinem Forum gefunden. Weil ja VC++ doch leicht anders ist als C++.
@Mod: kann der Thread bitte verschoben werden?
Nun also jetzt habe ich die Einbindungen gemacht, ändert sich trotzdem nichts
e:\vs++_data\vbtest\vbtest.h(20) : error C2143: Syntaxfehler: Es fehlt ')' vor '*' e:\vs++_data\vbtest\vbtest.h(20) : error C2143: Syntaxfehler: Es fehlt ';' vor '*' e:\vs++_data\vbtest\vbtest.h(20) : error C2059: Syntaxfehler: ')' e:\vs++_data\vbtest\vbtest.h(20) : error C4430: Fehlender Typspezifizierer - int wird angenommen. Hinweis: "default-int" wird von C++ nicht unterstützt. e:\vs++_data\vbtest\vbtest.h(20) : warning C4183: 'THOSTDEVICECHANGEPROC': Rückgabetyp fehlt; Memberfunktion, die 'int' zurückgibt wird angenommen e:\vs++_data\vbtest\vbtest.h(23) : error C2143: Syntaxfehler: Es fehlt ')' vor '*' e:\vs++_data\vbtest\vbtest.h(23) : error C2143: Syntaxfehler: Es fehlt ';' vor '*' e:\vs++_data\vbtest\vbtest.h(23) : error C2059: Syntaxfehler: ')' e:\vs++_data\vbtest\vbtest.h(23) : error C4430: Fehlender Typspezifizierer - int wird angenommen. Hinweis: "default-int" wird von C++ nicht unterstützt. e:\vs++_data\vbtest\vbtest.h(23) : warning C4183: 'TGetAllConnectedInterfaces': Rückgabetyp fehlt; Memberfunktion, die 'int' zurückgibt wird angenommen e:\vs++_data\vbtest\vbtest.h(24) : error C2146: Syntaxfehler: Fehlendes ';' vor Bezeichner 'GetAllConnectedInterfaces' e:\vs++_data\vbtest\vbtest.h(24) : error C4430: Fehlender Typspezifizierer - int wird angenommen. Hinweis: "default-int" wird von C++ nicht unterstützt. e:\vs++_data\vbtest\vbtest.h(24) : error C4430: Fehlender Typspezifizierer - int wird angenommen. Hinweis: "default-int" wird von C++ nicht unterstützt. e:\vs++_data\vbtest\vbtest.h(35) : error C2090: Funktionsergebnis ist ein Array e:\vs++_data\vbtest\vbtest.h(28) : error C2664: 'LoadLibraryW': Konvertierung des Parameters 1 von 'const char [11]' in 'LPCWSTR' nicht möglich Die Typen, auf die verwiesen wird, sind nicht verknüpft; die Konvertierung erfordert einen reinterpret_cast-Operator oder eine Typumwandlung im C- oder Funktionsformat. e:\vs++_data\vbtest\vbtest.h(31) : error C2065: 'GetAllConnectedInterfaces': nichtdeklarierter Bezeichner e:\vs++_data\vbtest\vbtest.h(31) : error C2146: Syntaxfehler: Fehlendes ';' vor Bezeichner 'GetProcAddress' e:\vs++_data\vbtest\vbtest.h(38) : error C3861: "GetAllConnectedInterfaces": Bezeichner wurde nicht gefunden. e:\vs++_data\vbtest\vbtest.h(40) : warning C4172: Adresse einer lokalen Variablen oder eines temporären Werts wird zurückgegeben
VC++:
// vbtest.h #include "stdafx.h" #include "stdio.h" #include "windows.h" #include "iostream" #include "string" using namespace std; #pragma once using namespace System; namespace usbdmx { public ref class wrapper { // types for library functions typedef unsigned char TDMXArray[512]; typedef char TSERIAL[15]; typedef TSERIAL TSERIALLIST[31]; typedef void (STDCALL* THOSTDEVICECHANGEPROC) (void); // define library functions typedef void (STDCALL* TGetAllConnectedInterfaces) (TSERIALLIST* SerialList); TGetAllConnectedInterfaces GetAllConnectedInterfaces; int main(array<System::String ^> ^args) { HINSTANCE dll_handle = LoadLibrary("usbdmx.dll"); // Get library function addresses GetAllConnectedInterfaces = (TGetAllConnectedInterfaces)GetProcAddress(dll_handle, "GetAllConnectedInterfaces"); } public: TSERIALLIST GetAllInterfaces() { TSERIALLIST InterfaceList; GetAllConnectedInterfaces(&InterfaceList); return InterfaceList; } }; }
-
Warum mischst Du ISO C++ mit C++/CLI.
Das würde ich nicht tun, Du handelst Dir nur Probleme ein, die Du nicht einfach lösen kannst. Ausserdem , wo ist der Sinn?Simon
-
Dieser Thread wurde von Moderator/in Martin Richter aus dem Forum MFC (Visual C++) in das Forum C++/CLI mit .NET verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
theta schrieb:
Warum mischst Du ISO C++ mit C++/CLI.
Das würde ich nicht tun, Du handelst Dir nur Probleme ein, die Du nicht einfach lösen kannst. Ausserdem , wo ist der Sinn?Simon
Nun ich habe bisher noch nicht soviel Erfahrung mit C++.
Das ISO c++ ist sicher das von Visual C++ oder?
Nun ich wollte MS Visual C++ benutzen um eine DLL zu erstellen die ich dann auch in VB.NET über Verweise einbinden kann ohne eine API Deklaration.Testweise habe ich jedoch erstmal versucht in Dev-C++ eine DLL von dem BeispielCode zu erstellen, um erstmal die grundlegenden Funktionen zu erlernen.
Jedoch bin ich glaube zu sehr an VB gewöhnt das ich mit c++ nicht wirklich klar komme.Ich wollte eine einface Funktion machen, die mir das Array vom Type TSERIALLIST zurückgibt und gemerkt, das geht wohl gar nicht. Mit Integer habe ich es bereits hinbekommen aber String z.B. wiederum nicht.