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;
}
DLL Import GetInputName / GetOutputName immer nur 1 Zeichen
-
- Beiträge: 2
- Registriert: Montag 2. November 2015, 08:47
-
- Beiträge: 2
- Registriert: Montag 2. November 2015, 08:47
Re: DLL Import GetInputName / GetOutputName immer nur 1 Zeichen
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.
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.
Re: DLL Import GetInputName / GetOutputName immer nur 1 Zeichen
Wenn man es genau nehmen will: ist Char ein UByte, da in Standard C (ANSI) ein String eine Folge von UBytes ist - Null terminiert.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.
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
ByRef = die Memory-Adresse des Strings wird übergeben (nicht der String selbst).
++++++
Gruss/regards IKT
Gruss/regards IKT