LPT ansteuern aber mit C++ und .Net
-
Vielleicht mal in diesem Unterforum
C++/CLI mit .NET
posten. :p
-
Dieser Thread wurde von Moderator/in Jochen Kalmbach aus dem Forum WinAPI 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.
-
versuch mal, die dll dynamisch zu laden:
http://www.hytherion.com/beattidp/comput/pport/Test2.c
(http://www.logix4u.net/inpout32.htm)Das ist dann natuerlich kein .net
Aber dazu ist c++/cli ja da, dass man .net mit "normalem" c++ mischen kann.
-
Hab jetzt versucht die Dll so einzubinden:
private: System::Void Form1_Load(System::Object^ sender, System::EventArgs^ e) { hLib = LoadLibrary("inpout32.dll"); }
Doch dann kommt folgender Fehler:
1>c:\dokumente und einstellungen\bnightspeeder\eigene dateien\visual studio 2005\projects\robot controller\robot controller\Form1.h(97) : error C2065: 'hLib' : undeclared identifier
1>c:\dokumente und einstellungen\bnightspeeder\eigene dateien\visual studio 2005\projects\robot controller\robot controller\Form1.h(97) : error C3861: 'LoadLibrary': identifier not found
-
Du musst die Funktionen in der DLL einfach via DllImportAttribute einbinden
-
Also ich hab das nun eine Klasse erstellt:
#pragma once using namespace System; using namespace System::Runtime::InteropServices; // Für DllImport ref class inpout32 { public: inpout32(void); [DllImport("inpout32.dll", EntryPoint="Out32")] static void Output(int adress, int value); };
Und will nun die Funktion so nutzen:
private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) { inpout32::Output(888, 255); }
Doch leider kommt der Fehler:
error C2653: 'inpout32' : is not a class or namespace name
: error C3861: 'Output': identifier not foundAber wieso ich hab die Klasse doch, und sie wurde auch mit dem Assistenten erstellt, ich verstehe das nicht.
-
AFAIK musst Du noch die passende H-Datei Datei noch includieren...
PS: Es geht auch ganz ohne DllImport: Einfach die h-Datei der inout-DLL includieren und die LIB-Linken, aufrufen, fertig.
-
#include "inpout32.h"
So hab ich es in die Projektname.cpp eingefügt nach
#include "stdafx.h"
und nach allen anderen Form Headern.
Aber wie soll ich die LIB linken?? Ich hab sie einfach im Projektverzeihniss. Ich kenn mich da nicht so gut aus.
-
#pragma comment(lib, "name-der.lib")
-
So? Aber dann kommt immer noch der Fehler.
// Robot Controller.cpp : main project file. #include "stdafx.h" #include "Konfig.h" #include "Form1.h" #include "inpout32.h" #pragma comment(lib, "inpout32.dll") using namespace RobotController; [STAThreadAttribute] int main(array<System::String ^> ^args) { // Enabling Windows XP visual effects before any controls are created Application::EnableVisualStyles(); Application::SetCompatibleTextRenderingDefault(false); // Create the main window and run it Application::Run(gcnew Form1()); return 0; }
-
Welcher Fehler denn?
Und was steht in "inpout32.h" drin?
-
inpout.h :
#pragma once using namespace System; using namespace System::Runtime::InteropServices; // Für DllImport ref class inpout32 { public: inpout32(void); [DllImport("inpout32.dll", EntryPoint="Out32")] static void Output(int adress, int value); };
Fehler:
: error C2653: 'inpout32' : is not a class or namespace name
: error C3861: 'Output': identifier not found
-
Also: Nochmals zum langsamen mitdenken...
1. Du kannst ganz normal LIB-Dateien linken und ganz normal (alte/native) C/C++ Funktionen aufrufen. Das ist der einfachst/schnellste und auch bevorzugste Weg InterOp in C++/CLI zu machen!!!
2. Du kannst von Hand eine Funktion einer mittels DllImport-Attribute einfügen.
Du bringst gerade beide durcheinander...
Entscheide Dich mal was Du willst, dann kann ich Dir weiterhelfen...
-
Ok, dann nehme ich die zweite aber was muss ich dan am Code ändern, ist das erste mal das ich mit libs arbeite.
-
Du arbetest nicht mit LIBs...
Und includiere "inpout32.h" in die cpp-Datei wo Du die Methoden auch verwenden willst.
-
Danke, es geht nun alles, nur noch eins:
Wie mach ich das mit Input?
Wenn ich die Funktion einfach so hinzufüge kommt nen Error:
static void Input(int adress);
1>Robot Controller.obj : error LNK2020: unresolved token (06000012) inpout32::Input
1>inpout32.obj : error LNK2020: unresolved token (06000003) inpout32::Input
1>C:\Dokumente und Einstellungen\BNightSpeeder\Eigene Dateien\Visual Studio 2005\Projects\Robot Controller\Debug\Robot Controller.exe : fatal error LNK1120: 2 unresolved externals
-
Hab es nun so:
ref class inpout32 { public: //LIB Funktionen inpout32(void); //Input/Output Befehle //Output [DllImport("inpout32.dll", EntryPoint="Out32")] static void Output(int adress, int value); //Input [DllImport("inpout32.dll", EntryPoint="Inp32")] static void Input(int adress); };
Edit: Hat sich erledigt.