Hilfe bei Easylase.dll und C#
Posted: Thu 06 Mar, 2008 9:18 am
Moin moin,
ich hab nach längerer Zeit mal wieder meine Anlage angeschmissen und mir natürlich den aktuellen Treiber für die Easylase runtergeladen. Habe dann gleich mal Lasertennis und Astroids ausprobiert und war schon ziemlich begeistert
Kurzum inspiriert davon wollte ich mich mal dran machen und was eigenes, bevorzugt in C#, programmieren. Ich stehe noch ganz am Anfang und komme leider nicht so recht weiter.
In der Dokumentation der DLL ist die Funktion zum Schreiben eines Frames wie folgt definiert:
Mein C# Code bisher:
Das Funktioniert nicht
Gibt mecker zur Laufzeit.
Da nörgelt der Compiler schon beim fixed(...) Warning möglicherweise falsche leere Anweisung.
EasyLaseWriteFrame(...) Error Der Name ptr ist im aktuellen Kontext nicht vorhanden.
Kann mir vielleicht jemand auf die Sprünge helfen? Eigentlich wäre ein zweidimensionales Array später doch auch einfacher zu handhaben oder? n*8 Byte. Wie macht man sowas mit Pointern in C#?
Ohne ist ja nicht schwer:
ich hab nach längerer Zeit mal wieder meine Anlage angeschmissen und mir natürlich den aktuellen Treiber für die Easylase runtergeladen. Habe dann gleich mal Lasertennis und Astroids ausprobiert und war schon ziemlich begeistert

Kurzum inspiriert davon wollte ich mich mal dran machen und was eigenes, bevorzugt in C#, programmieren. Ich stehe noch ganz am Anfang und komme leider nicht so recht weiter.
In der Dokumentation der DLL ist die Funktion zum Schreiben eines Frames wie folgt definiert:
Code: Select all
Function EasyLaseWriteFrame(CardNumber:integer, Datapointer:pointer,
Byteanzahl:integer, Punktspeed :word):boolean
Code: Select all
public partial class Form1 : Form
{
[DllImport("easylase.dll")]
public static extern int EasyLaseGetCardNum();
[DllImport("easylase.dll")]
public static unsafe extern bool EasyLaseWriteFrame(int cardNumber, byte[] datapointer, int bytecount, int speed);
[DllImport("easylase.dll")]
public static extern bool EasyLaseStop(int cardNumber);
[DllImport("easylase.dll")]
public static extern bool EasyLaseClose();
private int easylaseCount;
public unsafe Form1()
{
InitializeComponent();
easylaseCount = EasyLaseGetCardNum();
if (easylaseCount > 0)
{
byte[] frame = new byte[] { 0, 0, 0, 0, 255, 0, 0, 255, 128, 0, 0, 0, 255, 0, 0, 255 };
EasyLaseWriteFrame(0, frame, 16, 5000);
}
}
private void Form_Closing(object sender, EventArgs e)
{
if (easylaseCount > 0)
{
EasyLaseStop(0);
EasyLaseClose();
}
}
}
Das Funktioniert nicht

Ich hab es auch schon mit diversen Varianten versucht z.B.Es wurde versucht, im geschützten Speicher zu lesen oder zu schreiben. Dies ist häufig ein Hinweis darauf, dass anderer Speicher beschädigt ist.
Code: Select all
[DllImport("easylase.dll")]
public static unsafe extern bool EasyLaseWriteFrame(int cardNumber, byte *[]datapointer, int bytecount, int speed);
byte []frame = new byte[] { 0, 0, 0, 0, 255, 0, 0, 255, 128, 0, 0, 0, 255, 0, 0, 255 };
fixed(byte *ptr = frame);
EasyLaseWriteFrame(0, ptr, 16, 5000);
EasyLaseWriteFrame(...) Error Der Name ptr ist im aktuellen Kontext nicht vorhanden.
Kann mir vielleicht jemand auf die Sprünge helfen? Eigentlich wäre ein zweidimensionales Array später doch auch einfacher zu handhaben oder? n*8 Byte. Wie macht man sowas mit Pointern in C#?
Ohne ist ja nicht schwer:
Code: Select all
byte[,] 3x3array = byte[,] {{0,1,2}, {0,1,2}, {1,2,3}};