Laden...

Forenbeiträge von doubleII Ingesamt 33 Beiträge

27.10.2016 - 10:04 Uhr

Also besser geeignet wäre XML aber ich kann auch JSON nehmen. Hm vielleicht nehme ich doch XML.

Hier ein link an allen, die noch nicht wissen, wie man ein Text/XML/JSON Datei in Visual Studio einbinden kann. 😃
https://www.youtube.com/watch?v=874NuVyFg7I

Danke!

Schone Grüße
doubleII

27.10.2016 - 08:55 Uhr

Ich danke allen, die geschrieben haben.

Ich habe mich immer noch nicht entschieden welche Dateityp soll ich nehmen. Ich versuche es zu konkretisieren .

Es geht um Kameraeinstellungen, die beim Laden der Benutzeroberfläche gelesen werden müssen, also von einer Seite es geht um Standard Kameraeinstellungen, von anderer Seite, wenn man die Einstellungen ändert, sie können gespeichert werden, wenn der User will.

  1. Lesen der Datei
  2. Ändern der Datei (Schreiben auf die Datei).

Ich habe ein Objekt (Allgemeine Einstellungen) und in diesem Objekt andere Objekte, wenn man JSON nimmt (so weit ich die Sprache verstanden habe)
In diesem äußeren Objekt (Allgemeine Einstellungen) existieren Toolboxen (die andere Objekte). Sie haben eigene Einstellungen. Das ist alles.
Es ist nicht viel. Was würdet ihr für solche Einstellungen empfehlen.

Abt hat folgendes geschrieben:

ini Dateien sind ein Relikt und haben schon lange ihre Nachfolger - eben wegen den vielen Nachteilen! - gefunden: in XML und Json.

  • ini Dateien sind nur schwer bzw. umständlich pragrammatisch zu lesen
  • sie können nicht validiert werden
  • haben keinerlei Hierarchiemöglichkeit

Es ist Absicht, dass .NET von Haus aus keine INI-Unterstützung hat.
Sonst wäre dieses Konstrukt heute noch im Einsatz - ist es aber Gott sei dank in aktueller Software kaum noch.
Alles ist besser als eine ini Datei.

Okay dann bleiben die beide .xml, .json. Ich habe irgendwo gelesen, dass die XML-Doku bei Microsoft nicht großartig erklärt wird.
Pinki hat noch YAML als Möglichkeit gegeben.
Ich möchte was einfaches nehmen.

Vielen Dank!

26.10.2016 - 15:48 Uhr

Okay mir ist es das alles nicht so eindeutig aber Danke. 😃

Ich habe die .json Datei oben in der linken Ecke habe ich Schema: http.//json.schemastore. (Auswahl)
Für was sind die Schema? Was heißt das genau? Sind Verschiedene auto Schemas oder etwas anderes?

   string JSONstring = File.ReadAllText("generalConfig.json");

Warum habe ich einen Fehlermeldung > Fehlermeldung:

Die Datei wurde nicht gefunden.

Nochmal Vielen Dank!

26.10.2016 - 14:36 Uhr

Alles klar. Danke.

Ich habe eine Frage jetzt. Ich habe von NuGet Newtonsoft.json installiert. Muss ich dann eine .json oder .js erstellen?> Fehlermeldung:

unexpected character encountered while parsing value . path '' line 0 position 0

Danke!

26.10.2016 - 08:32 Uhr

Vielen Dank,

ich habe ein paar JSON Tutorial angeschaut, ich glaube, nehme ich JSON. XTM ist mir etwas schwer, glaube ich.
Warum auf kein Fall ini File. Was meint ihr damit?

Schöne Grüße
doubleII

25.10.2016 - 19:00 Uhr

An alle, die das gleiche Problem treffen. Die Lösung ist in der FreeImageBitmap class. Da System.Drawing ein default Bitmap Objekt erstellt, der 32 Bit ist. Auch schneller

Schöne Grüße
doubleII

25.10.2016 - 18:50 Uhr

Hallo,

was wäre einfacher, wenn man Einstellungen einer Benutzeroberfläche speichern, aufrufen, ändern (also Speicherverwaltung) möchte. Ini File oder XML? Was würdet ihr mir empfehlen?

Schöne Grüße
doubleII

27.09.2016 - 12:44 Uhr

ja genau voller Treffer. Ich muss mit win32 API arbeiten. Es wird eine nicht verwaltete Funktion, die in einer Dll Datei implementiert ist, aufgerufen.
sie lautet :


//Deklaration
[DllImport("Toolbox.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl,")]
public static extern int Execute(int count, [MarshalAs(UnmanagedType.LPArray)] HBITMAP[] bitmaps);


private void btnExecute(object sender, EventArgs e)
{
       
       Bmp[0] = GetHbitmap();   
           
       Execute(count, Bmp);
}

ich verstehe immer noch nicht wie ich das machen muss.

😦 .

Vielen Dank!

Schöne Grüße
doubleII

26.09.2016 - 16:14 Uhr

Hallo zusammen, ich habe folgendes Problem. Ein 8 Bit Bitmap image wird in BmpSource1 gespeichert. Das Bild übergebe ich weiter an dem Pointer Bmp mit Hilfe der GetBitmap() Methode.
Hier wird interessant. Das Bild wird 32 Bit. Hat jemand eine Idee, wie kann ich das Bild an dem Pointer übergebe ohne das Format zu ändern?

     

using HBITMAP = System.IntPtr;

public HBITMAP[] Bmp { get; private set; } = new HBITMAP[6];

DepthSVB1 = Image.GetPixelFormatSize(BmpSource1.PixelFormat); //8 Bit Image
Bmp[0] = BmpSource1.GetHbitmap(); // GetBitmap() gibt ein 32 Bit Bild zurück oder?  
Bitmap bitmaps = Image.FromHbitmap(Bmp[0]); 
DepthSVB2 = Image.GetPixelFormatSize(bitmaps.PixelFormat); // ich überprüfe das Format wieder. Hier wird 32 Bit Image.

Warum passiert das, kann mir jemand erklären?

Schöne Grüße
doubleII

31.08.2016 - 15:26 Uhr

Hallo weismat,

Interop/Nativen Code verwendest, dann muss alles 100 % korrekt sein.

ok, verstehe. Danke!

Eine Zugriffsverletztung kann auch ein Fehler beim Ein/Auspacken sein.
Ich persönliche arbeite da am liebsten mit einer eigenen DLL und habe minimalistische Test-Konsolenprogramme zum einfachen Testen jeder externen Funktion.

Ja, ich bin kein Programmier, sondern Elektrotechniker und miss ich immer was zusammen basteln. DLL Datei habe ich selber noch nicht erstellt, aber das muss auch lernen.

Gruß
doubleII

30.08.2016 - 18:03 Uhr

In diesem Fall die Fehlermeldung zeigt, dass die Signatur nicht richtig definiert wurde.
Also dann es ist noch etwas faul.
Danke für die Anweisung. Ich habe noch eine Methode, die die gleiche Fehlermeldung zeigt.
HWND showWindows(HWND hWnd, bool show, bool select)
Hwnd habe ich als IntPtr zugewiesen. Hm, okay danke. Dann weiß ich zumindest was die Fehlermeldung hier sagt.

Schöne Grüße
diubleII

29.08.2016 - 13:02 Uhr

Hallo Abt,

Ich greife mit Hilfe der Funktion (GetString) in einer Toolbox zu. In der Toolbox sind mehrere Parameter gespeichert und jeder Parameter liefert einen Wert zurück.
Bsp. Result.Status = 15 (als String). Wenn ich Result.Status in textbox2 eingebe muss ich im textbox3 15 (value muss 15 zurückliefern) bekommen.


int GetString(const char* Tag,
              char*       Value,
              UINT        ValueSize,
              BOOL* Valid);

Die Funktion habe ich in c# so umschreiben.

Wäre mir aber neu, dass man dem StringBuilder bei nem LPStr ne fixe Größe mitgeben kann, wenn das die Signatur nicht unterstützt (zB in Form eines BufferSize Parameters)

ich habe die so umgeschrieben. Es war Fehler von mir.


 [DllImport("Toolbox.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
        static extern int GetString([MarshalAs(UnmanagedType.LPStr)] string tag, [MarshalAs(UnmanagedType.LPStr)]string valueStr, uint valueSize, bool valid);

private void btnGetString_Click(object sender, EventArgs e)
        {
            bool valid = true;
            uint valueSize = 1024;
            string tag =" ";
            string valueStr = " ";

            //String auslesen
            tag = textBox2.Text;    // wird ein String gespeichert Bsp. Result.Status

            try
            {
               // send 0 for succeed, or error code
                int getString = GetString(tag, valueStr, valueSize, valid); // hier tritt die Fehlermeldung ein
                

                textBox3.Text = valueStr.ToString(); // der Wert, der zurückgeliefert werden soll
                if (valueStr != null)
                {
                    checkBoxValid.Checked = true;
                }

            if (getString == 0)
                    {
                        textBox3.Text = valueStr.Length.ToString();
                        checkBoxValid.Checked = true;
                    }
                    else
                    {
                        textBox3.Text = "FALIED";
                    }
                }
                catch(StackOverflowException)
                {
                    MessageBox.Show("Stackoverflow!");
                }

        }

Schöne Grüße
doubleII

29.08.2016 - 11:01 Uhr

Hallo zusammen,

ich weiß, dass der Fehler sehr allgemein und oft auftritt, aber ich finde keine Lösung und bitte um etwas Hilfe. Es wird ein Parameter unter Tag gespeichert, wenn der Wert korrekt eingegeben ist die Funktion GetString liefert der String, der unter value ist, zurück und getString = 0.

die Fehlermeldung:> Fehlermeldung:

Ausnahme ausgelöst bei 0x0E07F489 (Toolbox.dll) in Version.exe: 0xC0000005: Zugriffsverletzung beim Schreiben an Position 0x00000000.

Danke!


    [DllImport("Toolbox.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
        static extern int GetString([MarshalAs(UnmanagedType.LPStr)] string tag, [MarshalAs(UnmanagedType.LPStr)]string value, uint valueSize, bool valid);
 private void btnGetString_Click(object sender, EventArgs e)
        {
            
            StringBuilder tag = new StringBuilder("");
            StringBuilder  value = new StringBuilder("", 1024);
            bool valid = false;
            int valueSize = value.Capacity;

            //String ausgeben
            tag.Append(textBox2.Text);                    
            listBox1.Items.Add("I'm Tag :" +tag);
                                 
            try
            {
                try
                {
                    int getString = GetString(tag, value, valueSize, valid); // Die Zeile, wo der Fehler auftritt
                    listBox1.Items.Add("I'm GetString : " + getString);
                    // send 0 for succeed, or error code
                    
                    if (getString == 0)
                    {
                        textBox3.Text = value.Length.ToString();
                        checkBoxValid.Checked = true;
                    }
                    else
                    {
                        textBox3.Text = "FALIED";
                    }
                }
                catch(StackOverflowException)
                {
                    MessageBox.Show("Stackoverflow!");
                }
            }

            catch (NullReferenceException ex)
            {
                MessageBox.Show(ex.ToString());
            }

            catch (DllNotFoundException ex)
            {
                MessageBox.Show(ex.ToString());
            }
        }

23.08.2016 - 11:03 Uhr

Hallo,
ich habe eine Frage. Es geht um folgendes. Es wird in einem Bitmap bm ein Bild gespeichert. Das Bild ist 8 Bit. Wie kann ich mit GetHbitmap() Methode ein 8 Bit anstatt 32 Bit Bitmapobjekt erstellen?

Danke!

Schöne Grüße
doubleII

21.08.2016 - 21:39 Uhr

Hallo Th69,

komischerweise habe den Code so umgeändert und es funktioniert.


[DllImport("E:\\Laser 2000\\Debug\\ScorpionVisionToolbox.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl, EntryPoint = "Execute")]
        static extern int Execute(int count, ref HBITMAP[] bitmaps); //nur ref HBITMAP [ ]
// Die Funktion hat einen Ausgabetype HRESULT 
// Den habe ich mit int ersetzt aber man kann auch mit 
//HRESULT = System.IntPtr; es funktioniert
 private void btnExecute_Click(object sender, EventArgs e)
        {
            int count = 0;
            HBITMAP[] bitmaps = new HBITMAP[3];
            bitmaps[0] = bm[0].GetHbitmap();
            bitmaps[1] = bm[1].GetHbitmap();
            bitmaps[2] = bm[2].GetHbitmap();
            count = bitmaps.Length;


            try
            {                
                    //LoadConfig(fname);
                    int hresult = Execute(count, ref bitmaps);
                    listBox1.Items.Add("I'm Execute: " + hresult);                           
            }

            catch (NullReferenceException ex)
            {
                MessageBox.Show(ex.ToString());
            }

            catch (DllNotFoundException ex)
            {
                MessageBox.Show(ex.ToString());
            }
        }

Be der Funktion habe ich wieder das gleiche Problem und die Funktion ist ziemlich einfach.



        [DllImport("Toolbox.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
        static extern int GetString([MarshalAs(UnmanagedType.LPStr)] string tag, [MarshalAs(UnmanagedType.LPStr)]string value, uint valueSize, bool valid);

 private void btnGetString_Click(object sender, EventArgs e)
        {
            bool valid = true;
            uint valueSize = 1024;
            string tag =" ";
            string value = " ";
       
            //String ausgeben 
            tag = textBox2.Text;    // wird ein String gespeichert 
            listBox1.Items.Add("I'm Tag von Getstring:" +tag);
                                 
            try
            {
                if(String.IsNullOrEmpty(tag))
                {
                    listBox1.Items.Add("Tag ist null");
                }
                int getString = GetString(tag, value, valueSize, valid); // hier tritt die Fehlermeldung ein
                listBox1.Items.Add("I'm GetString: " + getString);
                // send 0 for succeed, or error code
  
                textBox3.Text = value.ToString(); // der Wert, der zurückgeliefert werden soll
                if (value != null)
                {
                    checkBoxValid.Checked = true;
                }

            }

            catch (NullReferenceException ex)
            {
                MessageBox.Show(ex.ToString());
            }
            
        }



ich übergebe ihr einen Parameter (tag), wenn der Wert stimmt dann wird von der Toolbox ein Wert (velue) ausgelesen. Wenn ich die Funktion aufrufe und unkorrekten tag eingebe zeigt mir, dass der Parameter falsch ist, wenn ich der richtige schreibe zeigt mir wieder 0x00000000, obwohl eine NullReferenceExeption vorgesehen habe. Es zeigt mir unter
Auto -> this -> AccessibilityObject
folgende Fehlermeldung:> Fehlermeldung:

Der Ausdruck kann nicht evaluirt werden, da sich ein nativer Frame oben auf dem Stack befindet.

Ich habe für das Problem etwas gefunden aber es hilft mir irgendwie nicht.
http://stackoverflow.com/questions/10851719/cannot-evaluate-expression-because-a-native-frame-is-on-top-of-the-call-stack
Weiß du zufällig wie vermeidet man Stacküberlauf? Wie geht man mit diesem Problem um, bsp. hier?
Wäre super, wenn jemand darüber etwas reinschreibt.
Ich habe nicht geschrieben aber es ist eine Software 32 Bit.

Schöne Grüße
doubleII

18.08.2016 - 14:23 Uhr

Ich muss mal schauen, wie es gemacht wird.

17.08.2016 - 20:37 Uhr

Hallo Th69,

es hängt irgendwie. Ich lade die Bilder aber wenn ich sie auswerten möchte stürzt alles ab, es hat sich nichts geändert. Verstehe nicht.

  
[DllImport("Toolbox.dll", CharSet = CharSet.Ansi, CallingConvention=CallingConvention.Cdecl, EntryPoint = "Execute")]static extern int Execute(int count, [MarshalAs(UnmanagedType.LPArray)] HBITMAP[] bitmaps);

Beim Debugging unter Lokal
bekomme ich für bitmaps Bsp so was:

bitmaps
-> [0] {-184216928}
-> [1] {386207774}

aber ich bekomme keinen null Wert.

10.08.2016 - 14:48 Uhr

Hallo Th69,

wunderbar, vielen Dank für die Hilfe. Es funktioniert, aber wenn ich die Applikation von Debugging mode aufrufe es zeigt mir folgende Fehlermeldung:> Fehlermeldung:

Ausnahme ausgelöst bei 0x00000000(Toolbox.dll) in App.exe: 0xC0000005: Zugangsverletzung beim Lesen an Position 0x00000000.

Falls ein Handle für diese Ausnahme vorhanden ist, kann das Programm möglicherweise sicher ausgeführt werden.

Ich habe den Code so umgeschrieben:



 [DllImport("Toolbox.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl, EntryPoint = "Execute")]
static extern in Execute(int count, HBITMAP[] bitmaps);

 private void btnExecute_Click(object sender, EventArgs e)
        {
            int count = 0;
            
            HBITMAP[] bitmaps = new HBITMAP[2];
          
            bitmaps[0] = bm[0].GetHbitmap();  // private Bitmap [] bm = new Bitmap[2]; 
            bitmaps[1] = bm[1].GetHbitmap();
          
            count = bitmaps.Length;


            try
            {
                
                int execute = Execute(count,  bitmaps);
                listBox1.Items.Add("I'm Execute: " + execute);            
            }

            catch (Exception ex)
            {
               
                MessageBox.Show(ex.ToString());
            }

        }



weißt du vielleicht woran kann es liegen? Der Fehler wird gezeigt, wenn

int execute = Execute(counter, bitmaps);

ausgefühlt wird. Zeigerproblem habe gesucht aber finde keine Lösung.

Schöne Grüße
doubleII

09.08.2016 - 10:02 Uhr

Hallo zusammen,

wenn ich nur ein Bild übergeben möchte

HBITMAP bitmaps = _bmp.GetHbitmap Method ();

funktioniert reibungslos. Jetzt habe ich mehr als eine Kamera (Beispiel zwei Kameras) und die Bilder von der beiden Kamera habe ich als


private Bitmap _bm1;
private Bitmap _bm2;

gespeichert. Ich muss sie jetzt an HBITMAP bitmaps übergebe. Hat jemand eine Idee wie ich es machen könnte. In diesem Fall ist der counter auf zwei -> Anzahl der Kameras.
😦

Vielen vielen Dank!

28.07.2016 - 13:15 Uhr

Hallo Spook,

habe auch versucht. Es zeigt mir folgender Fehler:> Fehlermeldung:

System.Runtime.InteropServices.SEHException(0x80004005): Eine externe Komponente hat eine Ausnahme ausgelöst.

Grüße
doubleII

28.07.2016 - 12:28 Uhr

ja stimmt, dumme Frage aber ich habe auch so mit der Methode versucht. Das Problem war wo anders. Jetzt passt. Danke 😃.

Es zeigt mir ein andere Fehler:

FEHLER:> Fehlermeldung:

"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."

Nach Ihre Meinung ist die Funktion richtig in C# richtig deklariert?

in C++

int Execute(unsigned int count, HBITMAP* bmp);


using HBITMAP = System.IntPtr;


[DllImport("Toolbox.dll", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.Cdecl, EntryPoint = "Execute")]
static extern int Execute(uint count, HBITMAP bmp);

Durch Google habe ich noch herausgefunden, dass es womöglich an der Aufrufkonvention stdcall liegt. Hat jemand eine Idee, woran kann es liegen?

27.07.2016 - 16:29 Uhr

Hallo, ich habe eine Frage und zwar, wie konvertiert man ein Bitmap format in einem HBITMAP um den Wert in einer Unmanaged Funktion zu übergeben?



 [DllImport("Toolbox.dll", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.Cdecl)]
static extern int Execute(uint Count, HBITMAP Bitmaps);



 private void btnExecute_Click(object sender, EventArgs e)
        {
            uint Count = 1; // counter heißt 1 Kameras 
            HBITMAP Bitmaps = _bitmap; // in private Bitmap _bitmap wird das Image als Bitmap format gespeichert

            try
            {
      
                //???????????????????????
                int execute = Execute(Count, Bitmaps);
                listBox1.Items.Add("I'm Execute: " + execute);

            }

            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString());
            }
        }

Vielen Dank!

22.07.2016 - 08:21 Uhr

Danke erst mal für den Tipps. Es hat funktioniert.

Dahingehend auch die Bitte Dich sich an [Hinweis] Wie poste ich richtig? zu orientieren

mache ich.

19.07.2016 - 17:04 Uhr

Hallo zusammen,
ich habe eine Frage und es geht um das Type HWND. Wie könnte ich die Funktion in CSharp umwandle. Könnte mir jemand Tips geben?

HWND ShowUserInterface(HWND hwnd, BOOL show, BOOL setupMode)

Vielen Dank!

05.07.2016 - 18:23 Uhr

Hallo TH69,

Wie meinst du das? ich habe die Dll Datei unter debug, Release, sogar unter
System32 gespeichert , funktioniert nicht. Oder ich mache etwas falsch? Ich bin offen, wenn man etwas einfach lösen kann.

Schöne Grüße

05.07.2016 - 09:35 Uhr

Hallo Yeats,

Das kling super. Kurz zusammengefasst, ob ich es richtig verstanden habe.

  1. Die static Klasse erstellen
public static class NativeMethods
    {
        [DllImport("kernel32.dll")]
        public static extern IntPtr LoadLibrary(string dllToLoad);

        [DllImport("kernel32.dll")]
        public static extern IntPtr GetProcAddress(IntPtr hModule, string procedureName);

        [DllImport("kernel32.dll")]
        public static extern bool FreeLibrary(IntPtr hModule);

        [DllImport("kernel32.dll", SetLastError = true)]
        public static extern bool SetDllDirectory(string lpPathName);
    }

jetzt kann ich im Speicher dll Datei laden.
Wie verbinde ich die Klasse jetzt mit meiner. Mach bitte ein Beispiel.
Vielen Dank!

01.07.2016 - 11:57 Uhr

Hallo Yeats,
ich habe das Problem gelöst jetzt funktioniert.
Könntest du mir etwas mehr den Code oben erklären.
Danke Yeats,

Die Lösung:



    //geändert
    [UnmanagedFunctionPointer(CallingConvention.StdCall)]
    public delegate void DLL_Func(string logFunc);
   [DllImport("E:\\Laser 2000\\Debug\\Toolbox.dll",  CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)] 
01.07.2016 - 11:52 Uhr

Das kling super. Kurz zusammengefasst, ob ich es richtig verstanden habe.

  1. Die static Klasse erstellen

public static class NativeMethods
    {
        [DllImport("kernel32.dll")]
        public static extern IntPtr LoadLibrary(string dllToLoad);

        [DllImport("kernel32.dll")]
        public static extern IntPtr GetProcAddress(IntPtr hModule, string procedureName);

        [DllImport("kernel32.dll")]
        public static extern bool FreeLibrary(IntPtr hModule);

        [DllImport("kernel32.dll", SetLastError = true)]
        public static extern bool SetDllDirectory(string lpPathName);
    }

jetzt kann ich im Speicher dll Datei laden.

  1. Hier gebe ich den Pfad zur dll Datei und sie wird geladen. Der Zusammenhang mit der anderen Klasse Form1 ist mir nicht klar. 😦

SetDllDirectory(@"..\..\..\DLL");
LoadLibrary("Toolbox.dll");

######################################

[UnmanagedFunctionPointer(CallingConvention.StdCall)]
public delegate void DLL_Func(string logFunc);

Gerade habe getestet. Der gleiche Fehler wird rausgespuckt. 😦


using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using System.Windows.Forms;

using System.Runtime.InteropServices;


namespace Project_1
{
   //geändert
    [UnmanagedFunctionPointer(CallingConvention.StdCall)]
    public delegate void DLL_Func(string logFunc);

    public partial class Form1 : Form
    {

        public Form1()
        {
            InitializeComponent();
        }
        
        [DllImport("E:\\Laser\\Debug\\Toolbox.dll")]
        static extern int Initialize(string systemPath, string license, DLL_Func logFunc);

        private void btnExecute_Click(object sender, EventArgs e)
        {
            systemPath = @"E:\DLL\Debug\";
            license = "zFm6pwdkz";

            try
            {

                Form1.Initialize(systemPath, license, logFunc);

            }


            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString());
                //MessageBox.Show(ex.Message);
            }

        }
    }
}

01.07.2016 - 08:59 Uhr

Ich bin ein Schritt weiter gekommen. Ich habe Zugriff auf der Toolbox. Ich habe viel ausprobiert und für die, die gleiches Problem wie ich haben. SEHR WICHTIG!

[DllImport("Pfad\DLLdatei.dll")]
Beispiel: [DllImport("E:\Laser\Debug\Toolbox.dll")]
Wenn man die DLL Datei ins system32 kopiert funktioniert auch nicht, die Dll Datei wird nicht gefunden.

Könnte mir jemand sagen, ob ich die funktion richtig ins C sharp umgeschrieben habe?
Das ist die Funkt. von Dll Datei:

typedef void LogFunc(char* msg);

int  Initialize(const char* WorkingDirectory,
                const char* License,
                LogFunc*    logFunc);

Parameters:
WorkingDirectory - writeable location which may be used by the library for configuration files, logging and debugging purpose.
License - Tordivel supplied license string to enable toolbox image processing.
logFunc - callback function for info and debug messages. Normally set to NULL.
Returns:
errorcode or 0 for succeed

ich habe den Code jetzt so umgeschrieben:

using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using System.Windows.Forms;

using System.Runtime.InteropServices;


namespace Project_1
{
   // ????
    public delegate void DLL_Func(string logFunc);
    public partial class Form1 : Form
    {
        
        public Form1()
        {
            InitializeComponent();
        }
        
        [DllImport("E:\\Laser\\Debug\\Toolbox.dll")]
        static extern int Initialize(string systemPath, string license, DLL_Func logFunc);

        private void btnExecute_Click(object sender, EventArgs e)
        {
            systemPath = @"E:\DLL\Debug\";
            license = "zFm6pwdkz";

            try
            {

                Form1.Initialize(systemPath, license, logFunc);
              
            }


            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString());
                //MessageBox.Show(ex.Message);
            }

        }
    }
}

Für die logFunc bin ich mir nicht sicher, ob man sie so als Delegate eingeben kann und der Wert, den sie liefert irgendwie ist mir nicht klar, ob es so richtig ist. Wäre dankbar, wenn mich jemand korrigieren kann. Es zeigt mir folgendes als Fehlermeldung:

"Zusätzliche Informationen: Ein Aufruf an die PInvoke-Funktion "Project_1!Project_1.Form1::Initialize" hat das Gleichgewicht des Stapels gestört. Wahrscheinlich stimmt die verwaltete PInvoke-Signatur nicht mit der nicht verwalteten Zielsignatur überein. Überprüfen Sie, ob die Aufrufkonvention und die Parameter der PInvoke-Signatur mit der nicht verwalteten Zielsignatur übereinstimmen."

Danke!

28.06.2016 - 22:11 Uhr

Du kannst mit Hilfe von Assembly.Load nur CLR Assemblies bzw. Managed Assemblies wie Managed C++ laden.
Liegt diese Situation vor?

Danke! Es klingt logisch. Also wie Th69 geschrieben hat, "Assebly.LoadFile" ist überflüssig.

Verwende procmon um zu schauen, was genau er versucht zu laden und was fehlt.
Ist ne ziemliche Sisyphusarbeit aber so ists manchmal.

Ich habe etwas gefunden aber noch nicht ausprobiert. Was meint ihr muss ich was ändern oder passt es so. Wie ich den Code verstehe, er zeigt alle Prozesse.


using System.Diagnostics;
public static void Monitor()
    { 
        ArrayList existingProcesses = GetExistingProcess();  

        while (true)
        {  
            ArrayList currentProcesses = new ArrayList();
            currentProcesses = GetCurrentProcess();

            ArrayList NewApps = new ArrayList(GetCurrentProcess());

            foreach (var p in ExistingProcess)
            {
                NewApps.Remove(p); 
            }
            string str = "";
            foreach (string NewApp in NewApps)
            {
                str = "Process Name : " + NewApp + "   Process ID : " + System.Diagnostics.Process.GetProcessesByName(NewApp)[0].Id.ToString() + " ";
            }
            MessageBox.Show(str);
        }
    }

Hat jemand eine Ahnung was der Pointer "IntPtr logFunc" bekommt? es ist mir nicht ganz klar. 😦

27.06.2016 - 18:14 Uhr

Er ist nur als Beispiel. Es ist nicht der echte Key. 😃

27.06.2016 - 16:34 Uhr

Vielen Dank für die Info erst mal!

Ich habe heute ein Tipp bekommen. Ich kann die C++ Datei weglassen. D.h. ich darf direkt auf die dll Datei zugreifen (dll Datei ist auf Delphi geschrieben), also ich brauche keine Wrapper Klassen zu erstellen (so weit wie ich gelesen habe). Die Funktionen existieren in der dll Datei ich muss sie ansprechen. Es wurde mir so erklärt, dass ich das C++ Projekt als Muster nutzen kann. Ich habe ins Internet rescher-schiert und habe den Code so geschrieben:

 
using System;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using System.Reflection;

namespace Project_1
        private IntPtr logFung;   
     
        [DllImport("Toolbox.dll", CharSet = CharSet.Auto)]
        static extern int Initialize( string systemPath, string license, IntPtr logFung );

        [DllImport("ScorpionVisionToolbox.dll", CharSet = CharSet.Auto )]
        static extern int finalize();

        private void btnExecute_Click(object sender, EventArgs e)
        {
            // Windows DLL (non-.NET assembly)
            //systemPath = Environment.ExpandEnvironmentVariables("%SystemDrive%");
            //if (!systemPath.Trim().EndsWith(@"\"))
            //  systemPath += @"\";
            
            systemPath = @"E:\DLL\Debug\Toolbox.dll";
            

            try
            {
                Assembly assem = Assembly.LoadFile(systemPath);
            }
            catch (DllNotFoundException ex)
            {
                MessageBox.Show(ex.Message);
            }

            //nur als Beispiel 
            license = "F7LRmIFGHcJkqAZfPV4sN1Tuga2SyKJeBL3ZJ0SBZPwRpoeXb8wZUYVcO3EQcwPUfzTQDcOlMC";
            Initialize(systemPath, license, logFung);

 
        }
    }
}

es zeigt mir folgender Fehler:
Ein Ausnahmefehler des Typs "System.IO.FileNotFoundException" ist in mscorlib.dll aufgetreten.

Zusätzliche Informationen: Das System kann die angegebene Datei nicht finden. (Ausnahme von HRESULT: 0x80070002)
Ich habe unter Projekt -> Eigenschaften -> Estellen auf x86 eingestellt, da die Toolbox auf 32 Bit ist, keine Änderung.

Ich verstehe immer noch nicht was ich am IntPtr übergeben muss.

C++:
//Als Muster ich muss sie auf C# umschreiben. Sie existieren in der dll Datei.

int Toolbox::Initialize(LPCSTR systemPath, LPCSTR license, DLL_LogFunc* logFunc)
{
	if (m_initialize) return m_initialize((char*)systemPath,(char*)license,logFunc);
	return -1;
}

int Toolbox::Finalize()

	if (m_finalize) return m_finalize();
	return -1;
25.06.2016 - 18:17 Uhr

Hallo zusammen, Ich habe folgendes Problem:

Ich habe eine C# Application und ein C++ Projekt. MS Visual.net 2015.
Wie rufe ich jetzt von C# eine C++ Funktionen auf.
Suche schon einige Zeit und hab leider noch kein passendes Bsp. gefunden.
Wo könnte man mehr Info findet?
Ich habe eine Toolbox und der Code für sie ist auf C++ geschrieben, wie man oben als Beispiel eine Funktion sehen kann. Dll Datei habe ich zur Verfügung.
Ich wäre sehr dankbar , wenn mir jemand ein bisschen mehr erklären kann.
Vielen Dank!

Hier ist eine Funktion von dem C++ Code:
C ++ Funktion

int Toolbox::Initialize(LPCSTR systemPath, LPCSTR license, DLL_LogFunc* logFunc)
{
   if (m_initialize) return m_initialize((char*)systemPath,(char*)license,logFunc);
   return -1;
}

C Sharp

using System.Runtime.InteropServices;

namespace Project_1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }


        [DllImport("Toolbox.dll")]
        public static extern int Initialize( ????? ); // Funktion keine Methode. Was muss ich zwischen Klammern schreiben???
        private void btnExecute_Click(object sender, EventArgs e)
        {
              initialize( ???? );
        }
    }