DLL Import GetInputName / GetOutputName immer nur 1 Zeichen

Antworten
MLCMichaelLamber
Beiträge: 2
Registriert: Montag 2. November 2015, 08:47

DLL Import GetInputName / GetOutputName immer nur 1 Zeichen

Beitrag von MLCMichaelLamber » Montag 2. November 2015, 12:15

Hallo,

ich habe eine eigene C#-Dll geschrieben, die ich mit DLL-Import einbinde.
Das ganze funktioniert soweit prima.
Ein kleiner Schönheitsfelher hat die Sache aber, Input- und Output-Kanalnamen werden immer nur als 1 Zeichen dargestellt.

Hat jemand eine Idee?
Wenn ich die Funktion in einem Testprogramm aufrufe, kriege ich alle Zeichen zurück.

Danke für Eure Hilfe

[DllExport("GetInputName", CallingConvention = CallingConvention.StdCall)]
unsafe public static void GetInputName(byte Channel, char* name)
{
switch (Channel)
{
case 0:
// Name for input 0
name[0] = 'R';
name[1] = 'E';
name[2] = 'S';
name[3] = (char)0;
break;
case 1:
// Name for input 1
name[0] = 'S';
name[1] = 'T';
name[2] = 'A';
name[3] = (char)0;
break;
default:
// Name for input 1
name[0] = 'T';
name[1] = '0';
name[2] = (char)(Channel + 48);
name[3] = (char)0;
break;
}
}
[DllExport("GetOutputName", CallingConvention = CallingConvention.StdCall)]
unsafe public static void GetOutputName(byte Channel, char* name)
{
name[0] = 'S';
name[1] = (char)(Channel + 48);
name[2] = (char)0;
}

MLCMichaelLamber
Beiträge: 2
Registriert: Montag 2. November 2015, 08:47

Re: DLL Import GetInputName / GetOutputName immer nur 1 Zeichen

Beitrag von MLCMichaelLamber » Dienstag 3. November 2015, 17:58

Habe den Fehler gefunden.
Wie immer, wenn mans weiß, ist alles ganz simpel.
[DllExport("GetInputName", CallingConvention = CallingConvention.StdCall)]
unsafe public static void GetInputName(byte Channel, char* name)
{

name wird als char Pointer übergeben, char ist aber in C# ein Unicode-Zeichen, wenn man char in byte ändert funktioniert es.

IKT
Beiträge: 554
Registriert: Mittwoch 4. November 2009, 18:32

Re: DLL Import GetInputName / GetOutputName immer nur 1 Zeichen

Beitrag von IKT » Freitag 6. November 2015, 05:45

MLCMichaelLamber hat geschrieben:name wird als char Pointer übergeben, char ist aber in C# ein Unicode-Zeichen, wenn man char in byte ändert funktioniert es.
Wenn man es genau nehmen will: ist Char ein UByte, da in Standard C (ANSI) ein String eine Folge von UBytes ist - Null terminiert.
Im Übrigen, kann der ganze String auf einmal übergeben werden, die "Buchstaben einzeln" zu übergeben ist nicht mehr aktuell ... (war früher einmal die einzige Möglichkeit).
Kleines Beispiel in FreeBASIC:

Code: Alles auswählen

Sub GetInputName   (ByVal Channel As Byte, ByRef InputName As ZString) Export
	' use Select Case instead of 'endless' if statements (C equivalent of SWITCH statement)
	' you might still need them (the IF's) inside of Select Case ...
	Select Case Channel				' extend for as many as needed max. = 99
		Case 0
			InputName = "Div"		' enter the PIN's DESCRIPTOR (name) inside the double quotes
		Case 1
    		InputName = "Dvr"
	End Select
End Sub
Weil FreeBASIC sehr nahe bei C ist: ZString = C-String, der Terminator (0) wird automatisch (vom Kompiler) "angehängt" ...
ByRef = die Memory-Adresse des Strings wird übergeben (nicht der String selbst).
++++++
Gruss/regards IKT

Antworten

Zurück zu „DLL-Programmierung“