Laden...

[erledigt] USB Schreib/Lesegerät mit VC++ 6 DLL über C# ansprechen

Erstellt von Talon vor 14 Jahren Letzter Beitrag vor 13 Jahren 3.027 Views
T
Talon Themenstarter:in
67 Beiträge seit 2010
vor 14 Jahren
[erledigt] USB Schreib/Lesegerät mit VC++ 6 DLL über C# ansprechen

Hallo zusammen, bin neu hier im Forum und komme gleich mit einer vermutlich dummen Frage. Seit 2 Tagen suche ich nun erfolglos nach einer Lösung für mein Problem.

Ausgangssituation:
Ich habe am Rechner ein Lese/Schreibgerät via USB angeschlossen. Dazu habe ich vom Hersteller eine DLL (geschrieben in VC++ 6) und ein paar Codebeispiele (VC++ 6 & VB 6). Es gibt auch eine lauffähige Software, die allerdings nicht meinen Anforderungen entspricht.

Nun wollte ich mit C# (VS2008) ein eigenes Programm schreiben mit dem ich das Lese/Schreibgerät ansteuern kann.

Problemstellung:

Den DLL Aufruf hab ich in eine Klasse im Projekt gepackt.
Das ganze Funktioniert auch soweit mit anderen aufrufen wie z.B.

// Port öffnen/auslesen
[DllImport("hardware.dll")]
public static extern int OpenPort(string strInterfaceName, int Baudrate, int Timeout);

An den Interface Namen, den man für den Aufruf benötigt, bin ich "manuell" über die Software des Herstellers gekommen. Und hier beginnen auch meine Probleme. Laut DLL soll der folgende Aufruf mir den Namen des Angeschlossenen Gerätes liefern.

//Seriennummer/Gerätename USB Geräte
[DllImport("hardware.dll")]
public static extern unsafe int ListAllDeviceNames(char* NamenListe, int BufferSize);

Laut C++ Beispielcode soll man damit den Gerätenamen auslesen können.

int nMaxSize = 255;
char * USBNamesBuffer = new char[nMaxSize];
CStringList USBListe;
CString strName;
int nLen = ListAllDeviceNames(USBNamesBuffer,nMaxSize);
int nStrLen = 0;
do
{
strName = USBNamesBuffer + nStrLen;
nStrLen += strName.GetLength() + 1;
if(strName.GetLength() != 0)
USBListe.AddTail(strName);
}while(strName.GetLength() != 0);
delete USBNamesBuffer;

Ich hab nun versucht das irgendwie in C# unterzubringen. Der CountAllDevices Aufruf funktioniert noch und liefert mir als Wert eine 1.

private string USBName()
{
int iAnzahl = USBclass.CountAllDevices();
int iBufferSize = iAnzahl * 9 + 1;
// Get List of all USB Devices
unsafe
{
int nMaxSize = 255;
char* USBNamesBuffer = new char[nMaxSize];
string USBListe;
string strName;
USBclass.ListAllDeviceNames(USBNamesBuffer, iBufferSize);
      //rest erst einmal weg gelassen weil der Debugger überhaupt nicht so weit kommt.
return iBufferSize.toString();

Was mir der Debugger meldet:

Eine implizite Konvertierung vom Typ "char[]" in "char*" ist nicht möglich.

char* USBNamesBuffer = new char[nMaxSize];

Ändere ich das ganze ab, bleibt der Debugger beim Aufruf hängen.
1-Argument: kann nicht von "char[]" in "char*" konvertiert werden.

char[] USBNamesBuffer = new char[nMaxSize];

Ich habe keine Ahnung wie ich das abfangen kann. Ich hab mich nun 2 Tage lang bis hier hin durchgehangelt und komme nun einfach nicht mehr weiter. Ich habe was mit "Reflections" gefunden, aber nicht wirklich verstanden. Ich bin noch nicht dahinter gestiegen wie ich das umsetzen soll und ob mir das überhaupt hilft.

Entschuldigt meine dumme Frage. Ich hoffe das mir bei meinem Problem jemand helfen kann. Vielen Dank schon mal.

T
327 Beiträge seit 2006
vor 14 Jahren

Hatte auch mal ein ähnliches Problem - damals hats bei mir geklappt einen StringBuilder anstatt des char* bzw. char[] zu verwenden.. War allerdings eine DLL, die in Delphi geschrieben war...

T
Talon Themenstarter:in
67 Beiträge seit 2010
vor 13 Jahren

Vielen Dank für die schnellen Antworten. Ich werde mich heute in das Thema einlesen und versuchen das umzusetzen.

T
Talon Themenstarter:in
67 Beiträge seit 2010
vor 13 Jahren

Vielen Dank noch mal für die Hilfe. Ich konnte damit mein Problem lösen.
Hier noch mein Aufruf für alle die vielleicht mal mit ähnlichen Problemen kämpfen und Hilfe suchen. Ich kann nicht sagen ob es eine elegante Lösung ist, aber zumindest bei mir funktioniert es so.

Aufruf der API

        
        //Methode zum auslesen des Gerätenamens
        public string USBGeräteName()
        {
            StringBuilder sbStr = new StringBuilder();
            // Get List of all USB Devices
            int intGerät = API.ListAllDeviceNames(sbStr, 254);
            if (intGerät == 0)  // 0 = Fehler
            {
                Error er = new Error();
                er.GetLastError(); 
            }
            return sbStr.ToString();
        }

Und der Aufruf der VC++ 6.0 DLL


        //Seriennummer/Gerätename USB Geräte
        [DllImport("hardware.dll")]
        public static extern int ListAllDeviceNames([Out][MarshalAs(UnmanagedType.LPStr)]StringBuilder NamenListe, int BufferSize);

Thema erledigt !!

M
6 Beiträge seit 2010
vor 13 Jahren

Einfach mal Danke 👍--> dass du Dir die Mühe machtest Dein Resultat ins Forum zu stellen.

Als C# Beginner hilft das ungemein und die nun endlosen "Hello World" kann ich schon nicht mehr sehen und da müssen halt auch mal RFID-Projekte her.

CU
Martin