Laden...

Forenbeiträge von Viper2000 Ingesamt 63 Beiträge

08.04.2009 - 13:50 Uhr

Also die DLL ist zum Steuern einer anderen Software per TCP übers Netzwerk.
Die DLL wird vom Hersteller der anderen Software zur Verfügung gestellt.
Ich habe die DLL einfach in Visual Studio.NET 2008 als Verweis hinzugefügt und konnte diese dann auch so benutzen.

Nur bei der Sache mit dem Puffer bin ich bisher gescheitert 🤔

08.04.2009 - 13:36 Uhr

das habe ich mir auch zuerst so gedacht, allerdings steht dem folgende Fehlermeldung im Wege:

Fehler 3 6-Argument: kann nicht von "ref byte[]" in "ref object" konvertiert werden.

08.04.2009 - 13:28 Uhr

Hallo,

ich nutze folgende Methode aus einer DLL:

public virtual void blablabla(AccessFlags iAccessFlags, short iMemArea, int iAddress, int iNumMau, short iBytesPerMau, ref object vDataBuffer, ref object vAccessBuffer);

Die Methode erwartet also als vDataBuffer ein "object" auf Byte-Basis als Referenz.
Ich habe mir also folgendes angelegt:

object buffer = new byte[SizeMau];

diesen Buffer dann als Referenz an die Methode übergeben und laufen gelassen. Ich habe anschließend auch das richtige in dem Puffer stehen (sehe ich im Debugger von Visual Studio).

Allerdings kann ich nicht indiziert auf den Puffer zugreifen -> Fehlermeldung:

Fehler 3 Indizierung mit [] kann nicht auf einen Ausdruck vom Typ "object" angewendet werden.

Wie bekomme ich die Daten aus dem Puffer zur weiteren Verarbeitung?

Viper

07.01.2009 - 03:05 Uhr

Hi herbivore, danke für die Antwort,

anderer Denkansatz: Wenn ich die Dateien als Textdatei in mein Projekt mit Aufnehme und dann mit Fileoperationen daraus lese und darin schreibe, wird es dann bei einer Installation mitinstalliert? Falls ja könnte ich ja den Application Startup Path ermitteln und in Bezug zu diesem auf die Files zugreifen...Auf jeden Fall MUSS ich das irgendwie bewerkstelligen! 🤔

Gruß, viper

06.01.2009 - 22:52 Uhr

Hallo danke und frohes neues euch allen,

hab mich nochmal an das Problem gesetzt. Wenn ich meine benötigte Textdatei als Resource hinzufüge, kann ich natürlich prima aus dem Code darauf zugreifen, allerdings kann ich diese dann nicht zur Laufzeit vom User in einer textBox modifizieren lassen da die Resource schreibgeschützt ist 🙁

Also nochmal zusammenfassend:

  • Ich benötige eine Textdatei die in irgendeiner Form mit eingebettet wird (auf den Installationsrechner mitkopiert wird beim Installieren).
  • Ich muss aus meinem Code auf diese Datei zugreifen können
  • Der User muss den Inhalt der "Resource" editieren können(dafür baue ich mir ein kleines Form mit ner Textbox und Save-Button).

Wie gesagt, mit den normalen Resourcen komme ich nicht weiter, da diese nicht zur Laufzeit beschreibbar sind...

Gruß,
viper

19.12.2008 - 13:37 Uhr

Ich kenne den Unterschied jetzt nicht genau aber ich will das was in der Datei steht aus meinem tool heraus editieren können (in ner TextBox oder ähnliches und daraus lesen können. Für den Anwender kann die Datei ruhig "unsichtbar" bleiben.

19.12.2008 - 13:28 Uhr

Hi,

ja ich weiß wie ich aus Dateien lese bzw. hineinschreibe...es ging mir eher darum wie ich eine Textdatei fest (als Resource oder sowas) in mein Projekt bekomme die dann auch auf den Zielrechner mitinstalliert wird und wie ich dann Rechner- und Pfadunabhängig auf diese Datei zugreifen kann.

Viele Grüße,
Viper

19.12.2008 - 12:55 Uhr

Hallo,

ich bin ein Tool mit Visual C# am Entwickeln das ANSI-C - Codefiles generiert. Dazu würde ich gerne wiederkehrende Kommentarblöcke die später in die ANSI-C Datei (wie z.B. Header-Kommentare usw.) in eine Textdatei auslagern und von da immer wieder lesen und in meine zu erzeugende ANSI-C Datei schreiben.

Ich könnte die Kommentarblöcke natürlich auch jedesmal Hardcoden aber das ist natürlich nicht schön weil ich sonst quasi ANSI-C "Kommentarblöcke" in meinem C# Code habe.

Ich habe jedenfalls jetzt eine Textdatei zu meinem Projekt hinzugefügt. Aber wie kann ich aus meinem Code darauf zugreifen ist die Frage?

Wichtig wäre auch, dass die Textdateien später beim Setup dann mit auf den Zeilrechner installiert werden.

Ich hoffe ich habe mich halbwegs verständlich ausgedrückt.

Viele Grüße,
Viper

04.12.2008 - 17:10 Uhr

Ich hab mir mal die MSDN Artikel zum Thema Drucken angesehen aber ich finde immer noch keine Lösung für mein Problem...

03.12.2008 - 22:32 Uhr

Hallo,

ich würde gerne ein Bild, was der User in eine PictureBox lädt, in einer bestimmten Größe auf dem Drucker ausgeben (z.B.: 100x120 mm).

Ich habe schon viel gesucht aber noch nichts konkretes gefunden bezüglich dieses Themas. Hat in der Richtung jemand einen Denkanstoss?

MfG Viper

14.11.2008 - 21:03 Uhr

Also ich bin gerade nicht am Rechner sondern mit dem Handy Online auf der Couch. Ansonsten hätte ich es mal direkt probiert. Also ich erstelle mir einen eigenen Delegaten und spare mir dann den "MethodInvoker" und rufe direkt den Delegaten innerhalt der Invoke Methode auf...korrekt?!

14.11.2008 - 12:41 Uhr

Hey herbivore,

danke für die Antwort!
Ich habe mich mal eingelesen aber noch nicht alles komplett verstanden.
Ich habe jetzt mal eine funktionierende Lösung die in meinem Augen abe rnicht optimal ist.

Habe eine Abfrage gemacht ob ein Invoke benötigt wird und dann per "new MethodInvoker( testMethod )" eine zusätzlich erstellte Methode Angestoßen.

Es läuft also so:
Der Workerthread gibt jedes mal wenn er was vom Netzwerk empfängt einen String an seine CallBack-Methode zurück. Dort wird der String in eine globale Variable gespeichert, da ich an meine Methode die ich per MethodInvoker anstoße keine Parameter übergeben kann. Finde das nicht so optimal.
Kannst du mir vielleicht noch etwas auf die Sprünge helfen wie es eleganter zu lösen ist?!

Hier mein Code(der auch jetzt funktioniert aber Stilecht ist):


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Threading;

namespace xxxxxx
{
    public partial class Form1 : Form
    {
        NetworkThread nwt;
        Thread thr1;
        string text;

        public Form1()
        {
            InitializeComponent();

            nwt = new NetworkThread(514, new MyCallback(LogParse));
            thr1 = new Thread( new threadStart(nwt.Starte) );
        }

        private void button_startLog_Click(object sender, EventArgs e)
        {
            button_startLog.Enabled = false;
            button_stopLog.Enabled = true;

            if (thr1.IsAlive == false)
                thr1.Start();
            else
                thr1.Resume();

            //Console.WriteLine("LOS GEHT ES");
        }

        private void button_stopLog_Click(object sender, EventArgs e)
        {
            button_startLog.Enabled = true;
            button_stopLog.Enabled = false;

            if (thr1.IsAlive == true)
                thr1.Suspend();
        }

        public void LogParse(string log)
        {
           text = log;
           if (textBox1.InvokeRequired())
               textBox1.Invoke( new MethodInvoker(test) );

           //Console.WriteLine(log);
           //textBox1.AppendText(log);
        }
        
        private void test()
        {
            textBox1.AppenText(text);
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            timer1.Start();
        }

        private void textBox1_TextChanged(object sender, EventArgs e)
        {

        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            Console.WriteLine(thr1.ThreadState.ToString());
        }


    }
}

Viele Grüße

13.11.2008 - 23:23 Uhr

Hi Community,

ich habe ein Problem, Habe mal angefangen mit Threads zu experimentieren. Ich habe einen Thread der aus dem GUI-Thread(Mainthread) heraus gestartet wird. Dieser Thread sammelt fortlaufend UDP-Datagramme auf einer Netzwerkschnittstelle.

Das klappt auch soweit ganz gut. Allerdings möchte ich diese Daten aus dem Thread in einem Textfield in der GUI anzeigen lassen. Dazu übergibt der Thread einfache Strings über eine Callback Funktion an den Mainthread. Wenn ich diese in der Callback Funktion im Mainthread in das Textfeld der GUI eintragen will sagt der Debugger, dass aus einem fremden Thread nicht auf die GUI zugegriffen werden darf.

Hier einfach mal meine Codefiles:

Erstmal der Workerthread:


using System;
using System.Collections.Generic;
using System.Text;
using System.Net;
using System.Net.Sockets;
using System.Threading;

namespace xxxxxx
{
    class NetworkThread
    {
        private int port;
        private MyCallback back;
       

        //KONSTRUKTOR
        public NetworkThread(int iPort, MyCallback iCallback)
        {
            port = iPort;
            back = iCallback;
        }

        //Start-Methode
        public void Starte()
        {
            int inputB;
            string inputS;
            byte[] puffer = new byte[256];

            IPEndPoint ep = new IPEndPoint(IPAddress.Any, port);
            Socket mySocket = new Socket(AddressFamily.InterNetwork,
                                  SocketType.Dgram,
                                  ProtocolType.Udp);
            mySocket.Bind(ep);

            try
            {
                while((inputB = mySocket.Receive(puffer)) != 0)
                {
                    inputS = Encoding.UTF8.GetString(puffer, 0, inputB);
                    
                    puffer = new byte[512];
                    back(inputS);
                }
            }
            catch (Exception ex)
            {
                SocketException mySocketError = new SocketException();
                
                Console.WriteLine(ex.Message);
                Console.WriteLine(mySocketError.ErrorCode.ToString());
            }
        }
    }
    public delegate void MyCallback(string log);
}

und hier das Mainform:


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Threading;

namespace xxxxxx
{
    public partial class Form1 : Form
    {
        NetworkThread nwt;
        Thread thr1;
        string text;
        Control ctrl;

        public Form1()
        {
            InitializeComponent();

            nwt = new NetworkThread(514, new MyCallback(LogParse));
            thr1 = new Thread(nwt.Starte);
        }

        private void button_startLog_Click(object sender, EventArgs e)
        {
            button_startLog.Enabled = false;
            button_stopLog.Enabled = true;
            
            if (thr1.IsAlive == false)
                thr1.Start();
            else
                thr1.Resume();

            //Console.WriteLine("LOS GEHT ES");
        }

        private void button_stopLog_Click(object sender, EventArgs e)
        {
            button_startLog.Enabled = true;
            button_stopLog.Enabled = false;
            
            if (thr1.IsAlive == true)
                thr1.Suspend();
        }

        public void LogParse(string log)
        {
           //Console.WriteLine(log); 
           textBox1.AppendText(log);   
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            //button_startLog.PerformClick();
            timer1.Start();
        }

        private void textBox1_TextChanged(object sender, EventArgs e)
        {

        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            Console.WriteLine(thr1.ThreadState.ToString());
        }

        
    }
}

Über hilfe wäre ich sehr dankbar!!!