Laden...

Forenbeiträge von aldababsack Ingesamt 26 Beiträge

09.10.2012 - 11:43 Uhr

Danke Erstmall für Eure Antworten..

Ich denke das ich BerndFfm´s vorschlag folgen werde, und die komplette DB interaktion in eine eigene Klasse verschiebe...

Das wird aber erstmall ne weile dauern, bis das wieder läuft...
.. da kann ich fast die ganze Anwendung neu schreiben...

hmmmm...
wie auch immer..
.. danke erstmall...

Aldababsack

08.10.2012 - 16:28 Uhr

verwendetes Datenbanksystem: Lokale *.mdf datei. (MSSQL compact oderso)

Hallo Comunity

Ich habe mich ein wenig selber in eine missliche lage "Reinprogramiert" 8o

Ich habe ein simples Program zum auswerten von Logfiles mittels Visual Studio 2010 geschriben, bei dem der ganze coder in der "form1" versteckt war.
Die Form1 hat im "Design modus" die ganzen "table adapter " usw auf dem unteren rand, und ist somit mit dem Dataset verknüpft.

Nun ist das Programm gelegentlich über corrupte files gestolpert.
Diese habe ich mal gesammelt, und nun wollte ich mein Program "verbessern"

Also habe ich beschlossen den eigentliche Rohdatenanalyse/ Filterung / Aufbereitung in eine Klasse auszulagern, weil der code in der "Form1" immer unübersichtlicher wurde.

Mehrere hundert zeilen ( Ok, viel davon komentar 😁 ) sind nun in der Klasse, Alle möglichen korupten files werden nun sauber erkannt, defekte einträge "repariert" oder gegen "NULL" getauscht...
Alles Schön und gut...

Jetzt aber mein problem..

Früher erfolgte die gesammte kommunikation mit der DB direkt aus de "Form1".

Jetzt wird ein wenig in die DB aus der Form1 geschriben, und die eigentlichen Rohdaten habe ich in meiner neu geschriebnen klasse "gefangen"weil ich sie nicht direkt in die DB schreiben kann... .. Die Klasse "kennt" dei Tableadapter aus Form1 nicht.

Achso: Der alte loop beinhaltet eine SQL procedur inclusive einen möglichen rollback...

wie am inteligenteesten vorgehen?

-> Ein typysiertes dataset "zu fuß" bauen, und dieses an die "form1" zurückgeben, und anschließend dieses in das Verlinkte dataset eins zu eins kopieren?
-> auf rollback verzichten( ungern), inerhalb der klasse zwite verbindung zu DB aufbauen, und die Daten Parallel reinschreiben?
-> oder gib tes eine möglichkeit die Tableadapter aus "Form1" "public" zu machen, so das ich direkt reichreiben kann?

Danke
Aldababsack

20.02.2009 - 22:27 Uhr

Danke für den Tip. 👍
Die Columns in C# haben bei mir alle möglicheen Sonderzeichen, und C# kann damit sehr gut umgehen..

Hast Ja im Prinzip recht.
Nur würde ich gerne trotzdem wissen, was erlaubt ist..
😁

oder mal anders herum.

Wenn der Column name das Problem ist warum eigentlich nicht Columm Nummer verwenden?

 
          
            // INSERT SQL-Anweisung für Excel erzeugen            
            StringBuilder builder = new StringBuilder("INSERT INTO [");            
            builder.Append(table.TableName);           
            builder.Append("$] (");            
            
            // Alle Spalten durchlaufen            
            for (int i = 0; i < columnCount; i++)            
            {                
                // Spaltennamen anfügen
                string colnam = table.Columns[i].ColumnName;   //----> Hier die Columnnummer verwenden?!
                
                // fehlerbehandlung bei exotischen Column namen 
                //  colnam = colnam.Replace 
                
                
                builder.Append(colnam);                
                
                // Parameter anfügen                
                parameterBuilder.Append("?");                
                
                // Wenn eine weitere Spalte folgt ...                
                if (i < (columnCount - 1))               
                {                    
                    // Kommas anfügen                    
                    builder.Append(",");                   
                    parameterBuilder.Append(",");                
                }            
            } 
            // SQL-Anweisung fertigstellen  
            builder.Append(parameterBuilder.ToString()); 
            builder.Append(")");
            
            string insertStatement = builder.ToString();   
            
            // alle werte durchlaufen          
            foreach (DataRow row in table.Rows)            
            {
                // Neuen OLEDB-Befehl erzeugen                
                OleDbCommand command = new OleDbCommand(insertStatement, connection);
               
                // Alle Spalten durchlaufen                
                foreach(DataColumn column in table.Columns)                
                {

                    string exwert = row[column].ToString();

                    // Parameter übergeben
                    command.Parameters.Add(new OleDbParameter(column.ColumnName ,exwert ));   //----> Hier die Columnnummer verwenden?!

                        
                  }
               


                command.CommandTimeout = 300;
                // Befehl ausführen
                command.ExecuteNonQuery();
            }   


Un-Entschärft sieht der command so aus.



NSERT INTO [XXXXX139030788$] (TimeStamp*hh:mm,Anfahr-Cnt*,Anlagenname*,E-heute*kWh,Error*,E-Total*kWh,ExtGloIrr*W/m^2,ExtSolIrr*W/m^2,Fac*Hz,FI-Code*,FI-Status*,h-On*h,h-Total*h,Iac*A,I-GFDI*A,Ipv*A,Komm.FehlerSMU*,Messdaten*Zyklen,MittelwertGrp1*mA,MittelwertGrp2*mA,MittelwertGrp3*mA,Mode*,MppSuchTag-Cnt*,Pac*kW,PB_DigInput1*,PB_DigInput2*,PB_DigInput3*,PB_DigInput4*,PB_DigInput5*,PB_DigInput6*,PB_DigInput7*,PB_DigInput8*,Ppv*kW,Reg.SMUs*SMUs,R-Insul*kOhm,SerialNumber*,SMUWarncode*,SMUWarnung*,Stoer.-Cnt*,Tagesenergie*Tage,Team-Status*,Temp.Kk*?C,TmpExtC*?C,TmpIntC*?C,TStartRestzeit*s,TWarteRestzeit*s,Upv*V,Upv0*V,VacL1*V,VacL2*V,VacL3*V,Warn.-Cnt*) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)

Wie ihr sieht, sind da so ziemlich alle Zeichen drinn, die eine Tastatur hergibt..
Wegen der nachhaltigkeit sollten auch die Columns in der Excel Tabelle gleiche Namen tragen.
Und dafür brauche ich Aber ne idee, wie ich die Column Namen auch nach excel rüberzaubern kann.

Irgendwelche ideen?

Danke
Aldababsack

19.02.2009 - 19:56 Uhr

verwendetes Datenbanksystem: <Data Table - Excel>

Hallo Forum

Ich habe nach der Anleitung von Rainbird Excel: DataTable mittels OLEDB in Excel-Dokument exportieren
ein Data table -> Excel exporter gebastelt.

Die neue Variante
Excel-Export ohne Excel (Snippet)
geht nicht, da maximal Excel 2000 verwendet wird.

Nun Haben meine Collums "bescheuerte Namen" mit Hochkomas, * , _ , __ , : ,
Mit "Try and Error" habe ich jetzt alle Sonderzeichen auf die ich gestoßen bin "entschärft"

Gibt es irgendwo eine liste der "verbotenen" Sonderzeichen??
..Damit in der Zukunft kein neuer Columnname mir mein Programm zum absturz bringt...

Oder ist einfach alles, was "nicht ASCI" ist verboten.

danke

Aldababsack

29.10.2007 - 15:19 Uhr

Danke! Danke! Danke!

29.10.2007 - 12:15 Uhr

Hallo Forum
Beim versuch eine binary file auseinander zu nehmen, habe ich kleine probleme
Ich wollte gerne für die fehlersuche eine Messagebox benutzen..


private void button1_Click(object sender, EventArgs e)
        {
            Stream myStream;
            OpenFileDialog openFileDialog1 = new OpenFileDialog();

            openFileDialog1.InitialDirectory = "c:\\";
            openFileDialog1.Filter = "binary files (*.bin)|*.bin|All files (*.*)|*.*";
            openFileDialog1.FilterIndex = 2;
            openFileDialog1.RestoreDirectory = true;

            if (openFileDialog1.ShowDialog() == DialogResult.OK)
            {
                if ((myStream = openFileDialog1.OpenFile()) != null)
                {
                    try
                    {
                        {
                        
                            BinaryReader sr = new BinaryReader(myStream);
                            // While not at the end of the file, read lines from the file.
                            int bytecounter = 0;
                            int bytestoread = 10;

                            while (sr.PeekChar() > -1)
                            {
                                           byte[] input = sr.ReadBytes(bytestoread);

                                MessageBox.Show("this is the First Byte in the file,  " + input[0].ToString() + "  shuld be hex 0A " );
                                          bytecounter++;

                            }
                            sr.Close();
                   
                        }
                    }
                    catch 
                    {
                        // Let the user know what went wrong.
                        MessageBox.Show ("The file could not be read:");
                        
                    }
    
                    myStream.Close();
                }
            }

        }

nun nemen wir an, das mein allererstes byte ein Hexadezimal 0A ist..

Mir wird abere in der message box immer 10 angezeigt..
( also dezimal)

was mache ich falsch?

Ich muss irgendwie anders umwandlen, aber wie ?

danke

Peter

03.04.2007 - 11:20 Uhr

Nicht mal Microsoft darf man trauen.... 8o

So habe ich es von HIER(click) Microsoft übernommen...

Das war mien Problem....

Vielen Dank!

Aldababsack

03.04.2007 - 08:43 Uhr

Hallo Forum 🙂

Ich habeda ein Problem...

Erstmat ein wenig struktur
Ichabe den Inhalt einer Textbox

->

diser wird mittels streamwriter in eine textdatei geschrieben.


            File.Delete(@"C:\temp\helptext.txt");
            


            StreamWriter helpschreiber = new StreamWriter(@"C:\temp\helptext.txt", false , Encoding.Default);  //encoding wegen ANSI format der Zieldatei
            helpschreiber.Write(helpTextBox.Text.ToString());
            helpschreiber.Close();

->
dise textdatei wird mittels FileStream in ein Byte array übertragen


                FileStream fs = new FileStream(@"C:\temp\helptext.txt", FileMode.OpenOrCreate, FileAccess.Read);
                byte[] MyData = new byte[fs.Length];
                fs.Read(MyData, 0, System.Convert.ToInt32(fs.Length));
                fs.Close();

dann in eine table geschrieben


//passende row suchen
... 
...
 foundRow["helptext"] = MyData;
...


table wird mittels tableadapter in die DB gesichert.
table wird geleert mit Rows.clear
table wird aus der DB neu gefuellet..
dann wird die (gleiche) row nochmall angewählt



            File.Delete(@"C:\temp\helptext.txt");
            helpTextBox.Text = "";
...
...
// Passender row suchen
...
...
                byte[] MyData = new byte[0];
                MyData = (byte[])foundRow["helptext"];
                int ArraySize = new int();
                ArraySize = MyData.GetUpperBound(0);
                if (ArraySize >= 0)
                {
                    FileStream fs = new FileStream(@"C:\temp\helptext.txt", FileMode.OpenOrCreate, FileAccess.Write);
                    fs.Write(MyData, 0, ArraySize);
                    fs.Close();

                }



so...

und hier fehlt immer das allerletzte zeichen im meinem text.

egal ob es ein buchstabe ist-> dan sieht das nur doof aus...

wenn aber CRCF am ende steht, dan wird nur CF geöscht , und dan funktioniert die andere anwendung nicht, dia auf die daten zugreift...

Ich gehe fest davon aus, das beim sprichern der TXT -> TABLE oder
TABle -> DB das zeichen verschluckt wird...

...aber wo...

achso..
Txt und inhalt ders BLOB ist in ANSI codiert, und soll auch so bleiben.

Vielen Dank im vorraus

Aldababsack

21.03.2007 - 13:44 Uhr

Danke!


            MeineBindingSource.SuspendBinding();



            table.Rows.Clear();
            ConnectToSQL(SQLconnectionString);
            fill_new_Collumn();

            MeineBindingSource.ResumeBinding()

war genu was ich gebraucht habe!!!

Vielen Dank!

Aldababsack.

21.03.2007 - 08:53 Uhr

Danke FZelle
leider funktioniert das nicht ..

Das problem ist, das die Collumn4 konstruiert ist..

das heisst,

nach einem table.reset und sqladapter.Fill(table)
habe ich nur 3 Collums.

Danach wird die 4 collumn wieder erzeugt und dynamisch mit inhalten gefüellt..

Das heisst das "combobox.databinding" eine Zeit lang "ins leere" zeigt, weil es kein collumn 4 gibt..

eigentlich zeigen all bindings ins leere, weil nach tablle.rest die Table "richtig leer" ist.. ( also auch keine collumn - Namen)

und das ist der punkt, ab dem die ganzen dat bindinmgs nicht funktioniern...

nun habe ich sowas probiert..


databindingtable= table;
//...
//.... heir alle datbindings auf databindingtable;
//...
table. reset;

sobald ich table.reset ausführe, wird auch databindingtable resetet..( weil sie ja nur ein verwis auf werte im speicher ist)

Gibt es irgendwas, was sich wie ein datatable anfassen lässt, ( also databindings drauflegen) , aber "statischer" ist?

Im DataTable1 liegt irgendsowas wie Zelle1|Reihe1 = Speicheradresse soundso
wenn ich nun
DataTable2 = DataTabel1 mache

dan steht im DataTabel2 Zelle1|Reihe1 sowas wie "verweis auf Datatable1 Zelle1|Reihe1 "

wenn ich nun DataTable1 resette, dan ist auch DataTable2 leer...

Wenn es doch nur sowas, wie bei excell "Werte kopieren" gäbe...

danke für eure unterstüzung..

Aldababsack

19.03.2007 - 15:02 Uhr

Hallo Forum...

Ich habe schon ein wenig gegoogelt und auch hier im forum gesucht, aber noch nichts verünftiges gefunden....

Ich habve ine binding source, die zu laufzeit erstellt wird.
diese bindings source wird aus einer Data-Tabelle erstellt die auch dynamischh ist..

Diese tabelle wird ab und zu verändert...

jedes mall wenn die tabelle verändert wird, soll die binding source aktuallisiert werden..

Das soll mittels diesen codes geschehen...


        //Hier wird das binding source  an die combobox und an die beiden textboxen gebunden.
        private void setup_MyBindingSource()
        {
          
            // weil alles nur einmall funktioniert hat..
            //... viellicht noch alter inhalt drin..
            // ....erstmall alles mögliche resetten


            MeineComboBox.ResetText();
            MeineComboBox.BindingContext = null;
            MeineComboBox.DataBindings.Clear();
            MeineComboBox.DataSource = null;
            MeineComboBox.DisplayMember = null;


            ersteTextBox.DataBindings.Clear();
            zweiteTextbox.DataBindings.Clear();

            MeineBindingSource.DataSource = null;
            MeineBindingSource.ResetBindings(true);
            MeineBindingSource.Clear();
            



            
            //  binding source wird angelegt...
            // wird doch nicht angelegt, wurde eine hiererhiestufe höher angelegt
            // ...wurde ganz oben abgelegt, hier wird nur gefuellt
            
            MeineBindingSource.DataSource = table;

            //nun kann ich der Combobox die binding source zuweisen.
            
            MeineComboBox.DataSource = MeineBindingSource;
            MeineComboBox.DisplayMember = "Collumn4";

            //jetzt kann ich mir auch noch die textboxen zuordnen
            ersteTextBox.DataBindings.Add("Text", MeineBindingSource, "Collumn2");
            zweiteTextBox.DataBindings.Add("Text", MeineBindingSource, "Collumn3");
        }


Soo...

Dieser code funktioniert immer nur beim erstenm mal...
Wenn ich die tabelle "table" neu erzeuge, und diesen code anschließend nochmall aufrufe, wird der code ausgeführt, aber inder Combobox ist nichts drin..

muss ich orgendwie die Binding source ersmall zersöhren odfer was ist da falsch??

Oder verändert isch die Combobox irdgendwie, ohne das ich es merke....

Vielen dank !

Aldababsack

16.03.2007 - 10:23 Uhr

hätte auch geholfen...

aber da waren ja mehrere Sachen auf einmall falsch


//richtig
(row["Collumn2"].ToString())

//falsch weil eckige klammern um row drumherum und tostring fehlt..
([row]["Collumn3"])


gruß
Aldababsack

16.03.2007 - 09:47 Uhr

Warum kommen die besten indeen, erst nach dem man gepostet hat ...?? 🤔
Manchmall hillft es einfach mal ins forum schreiben.. ... =)

so lösung:


 foreach (DataRow row in table.Rows)
                {
                    swr = new System.IO.StringWriter();
                    swr.Write(row["Collumn2"].ToString());
                    swr.Write(row["Collumn3"].ToString());
                    (row["Collumn4"]) = swr.ToString();

                 }

Schönen Dank

Aldababsack

16.03.2007 - 09:14 Uhr

Hallo Forum..

ich habe ein DataTable, , das aus 3 Spalten besteht.

(aus einer DB mit TableAdapter gefüllt...)

das funktioniert auch ganz gut...

Nun möchte ich eine neue Collumn hinzufügen..

klappt auch ganz gut...
Es wird eine neue Collum (typ String)erstellt, die erstmal kein inhalt hat..

Nur den inhalt kann ich mir irgendwie nicht genereieren....

Es soll "(String)Inhalt aus collumn 2" und "(String)Inhalt aus collumn3" in Collumn4 eingefügt werden.

hier mein code,




                // Loop through each row in the table.
                foreach (DataRow row in table.Rows)
                {
                    // Hier soll der inhalt für das Collumn 4 generiert werden...
                     string VERS = table.Rows[row]["Collumn2"] + table.Rows[row]["Collumn3"];
                    table.Rows[row]["Collumn4"] = VERS;

                 }


nur ist irgendwas an der art und weise, wie ich die Zellen anprechen will falsch..

hier die fehlermeldung aus Visual studio:


Die beste Übereinstimmung für die überladene System.Data.DataRowCollection.this[int]-Methode hat einige ungültige Argumente.
1-Argument: kann nicht von "System.Data.DataRow" in "int" konvertiert werden.

Vielen Dank schonmal im vorraus..

Aldababsack

15.03.2007 - 11:35 Uhr

WOW
das ging ja schnell...

SVENSON Lösung works !!!
und auch noch so simpel 🙂

(ich trottel ) 😉

Danke!!!

15.03.2007 - 11:29 Uhr

Hallo Forum

Ich habe schon hier eineige Antworten gefunden, aber es hat nix davon funktioniert 🙁

Ich habe eine Combo box, die über binding source usw an einer DB hängt...
Da Wähle ich irgendwas aus....

Inhalt der combobox ist string(20) (eigentlich SQL Char20)

Nun , da es aus einer DB stammt, wird hinter den eigentlichen Wert mit Leerzeichen aufgefüllt.

Diesen wert muss ich auslesen und neu verarbeiten

dazu muss ich die leerzeichn am ende wegbekommen..

aber es klappt nicht


                // Gibt mit den inhalt der combobox
                string MY_variable = MY_comboBox.SelectedValue.ToString();
                MY_variable.TrimEnd(); 
                MessageBox.Show(" Inhalt fängt hier an-->" + MY_variable + "<-- und ist hier zu ende");


habe auch mit

MY_variable.TrimEnd(null);
MY_variable.TrimEnd( );
MY_variable.TrimEnd();
MY_variable.TrimEnd(" ");

die messagebox hat immer Leerzeichen in der ausgabe:


Inhalt fängt hier an-->meintext       <-- und ist hier zu ende

Kann es sein, dass SQL mit "irgendwas anderem" auffüllt
(also sieht aus wie ein Leerzeich, ist aber keins? )

Schönen dank
Aldababsack

05.03.2007 - 12:52 Uhr

haha
😁



SELECT     *
FROM         dbo.VERSIONEN
WHERE     (teile_artikel_nr LIKE ?)


und



private void button9_Click(object sender, EventArgs e)
        {

            string baugruppenvariable = baugruppe_comboBox.SelectedValue.ToString();


           this.VERSIONENTableAdapter.FillByBaugruppe(this.DataSet1.SICHT_VERSIONEN,baugruppenvariable );            
} 


hat geholfen...

Ich musste der abfrage nur noch ein parameter hinzufügen, und diese mit der richtigen collum verbinden 🙂)))
(Mit der GUI 🙂

VIELEN dank!!

05.03.2007 - 09:04 Uhr

Hallo Friedel
Erstmall Schönen dank...

Hat funktioniert, aber war aus performance gründen net sooo toll 🙂

Ich habe immer 9000 Datensätze mit allen datails über eine "dünne " WLan verbindung geladen, und erst dann sortiert,...

Nun habe ich mir auf dem Server ein View eingerichtet, der nur die Buagruppennamen zurückgibt, jede baugruppe gibt es nur einamall, keine datails..

Geht jetzt viel schneller.. 🙂

Diese daten sind an die combobox verbunden, und hier wähle ich meine Baugruppe aus....

Wenn ich die baugruppe ausgewählt habe, dann startet die abfrage, für den komlpetten datensatz...

und heir mein nächstes problem....

Ich will mir ein Fillbybaugruppe basten, weiss aber nicht, wie ich den wert Übergeben soll...



private void button9_Click(object sender, EventArgs e)
        {

            string baugruppenvariable = baugruppe_comboBox.SelectedText
 

           this.VERSIONENTableAdapter.FillByBaugruppe(this.DataSet1.SICHT_VERSIONEN);            
 }


hier die abfrage aus dem abfragegenatetor

FillByBaugruppe


[SQL]

SELECT     *
FROM         dbo.VERSIONEN
WHERE     (bgr LIKE baugruppenvariable)

[/SQL]

irgendwo habe ich aber ein syntaxfehler, denn "baugruppenvariable" wird nicht übergeben.

was mache ich falsch?

Schönen dank
Aldababsack

27.02.2007 - 00:21 Uhr

Hallo Forum

Ich habe ein Problem, mit der Anbindungg meiner db an eine Combobox... (oder umgehert).

Erstmall die struktur der DB

|Bgr           | Ver   | Update   |
|platine1      |A      |1         |
|platine1      |A      |2         |
|platine1      |A      |3         |
|platine1      |A      |4         |
|platine1      |A      |5         |
|platine1      |A      |6         |
|platine1      |B      |1         |
|platine1      |B      |2         |
|platine1      |B      |3         |
|platine-abc   |X      |1         |
|platine-abc   |X      |2         |
|platine-abc   |X      |3         |
|platine-abc   |A      |1         |
|platine-abc   |A      |2         |
|platine-abc   |A      |3         |
|platine-abc   |B      |1         |
|platine-abc   |B      |2         |
|platine-abc   |B      |3         |

usw..

nun will ich die drei Werte in 3 comboboxen einbinden, um damit eine bestimte baugruppe in einer bestimten verion und mit einem bestimten update auswählen

Die comboboxen sind an die Beinding source gebunden... (alles zusamemengeklickert)

Und sie ändern sich auch alle "simultan"

und das ist mein Problem..

Ich würde in der ersten Combobox eine auswahl haben, in der jede Baugruppe nur einmall vertreten ist. ( momentan sehe ich jeden eintrag, also mehrmalls diegleiche BGR in verschiedenen versionen )

Wenn ich mich für die Baugruppe entscheiden habe, dann möchte ich jede Version davon sehen, ( Mommentan sehe ich mehrmalls die gleichen versionen, (weil verschidene updates)

und dann das Gleiche für die updates.

Ich glaube ich darf hier nicht direkt an dei binding source die comboboxen verknüpfen,

aber an was den dann??
?(
irgendeine Zwischicht??

Vielen Dank im vorraus...

Peter

06.12.2006 - 18:39 Uhr

Hallo Forum

Ich habe so zimlich jeden Ansatz im forum durchprobiert den ich gefunden habe, aber es klappt einfach nicht.
auch pinvoke.net hat mir nicht wirklich helfenn können......

folgendes Problem:

C DLL hat folgenden einsprungspunkt bzw erwartet folgenden input

 
DWORD fooGetDriver(DWORD * DriverIDArray, int maxDriverIDs);

so wie ich verstehe geht der maxDriverIDs ind die DLL "rein",
und der DriverIDArray kommt aus der dll "raus"

hier die Beschreibung

Parameter:
Mit dem Parameter "DriverIDArray" wird ein Zeiger auf den Speicherbereich (Array
von DWORD's) übergeben, in dem die Schnittstellen-ID's abgelegt werden. Der Parameter
"maxIDs" gibt die Anzahl der Schnittstellen-Ids an, die maximal im Array gespeichert
werden dürfen.
Resultat:
Die Funktion liefert die Anzahl der aktuell verfügbaren Schnittstellen zurück (Anzahl
der Handles im Array).

hier mein versuch der umsetzung


[DllImport("foo.dll", EntryPoint = "fooGetDriver")]
        public extern static int fooGetDriver(ref int DriverIDArray, int maxDriverIDs);
        
        //getdrivers
        private void button4_Click(object sender, EventArgs e)
        {
            int maxDriverIDs = 2
            yasdiMasterGetDriver( ref DriverIDArray, maxDriverIDs);       
            
        }


oder auch


[DllImport("foo.dll", EntryPoint = "fooGetDriver")]
        public extern static int fooGetDriver(ref int[] DriverIDArray, int maxDriverIDs);
        
        //getdrivers
        private void button4_Click(object sender, EventArgs e)
        {
            int maxDriverIDs = 2
            yasdiMasterGetDriver( ref DriverIDArray[maxDriverIDs], maxDriverIDs);       
            
        }


Wie auch immer, ich bekomme immer eine null im "DriverIDArray", bzw 2 nullen im zweitem versuch.

Ich hätte aber ein 0, 1 usw erwartet....

habe auch mi stringbuilder experimetiert,... immer 2 nullen zurück bekommen....
habe "ref" gegn "out" getauscht ... nix

so langsam bin ich am ende mit meinen ideen und für jede hilfe dankbar....

liebe grüße

Aldababsack

30.11.2006 - 11:42 Uhr

... AHA......

Danke!!!! 😁 😁 😁

Ich verkompliziere es mir manchmal selber gerne ein wenig.... X(

Vielen Dank!!!

30.11.2006 - 00:58 Uhr

Hallo allerseits.

Ich habe eine in c geschribene dll, die folgendes erwartet


void initialize( char * cIniFileName, DWORD * diunt)

nun greife ich ich aus C# (Visual Studio 2005) auf die Dll zu, ....


.
.
.
using System.Runtime.InteropServices;

.



       //Erstmal alles aufbauen  und mit werten versehen...
       int diunt = 99;
       string cIniFileName = null;

weiter unten.....
 

       [DllImport("meine.dll", EntryPoint = "initialize")]
        extern static void startmyprogramusingdll (ref string cIniFileName, ref int diunt);

dabei treten Probleme auf, wenn ich den "cIniFileName" anderen wert als "null" zuweise... Zb:


 string cIniFileName = "meinekonfig";

Bei der dll kommt itrgwndwas ganz anderes rein, als ich es erwartet hätte....
(Hieroglyphen)

Es sieht so aus das ein ein "c# int" einem "c DWORD" entspricht.
Aber ein "c# string" entspricht nicht einem "C CHAR".
(wenigstens nicht für die dll)

Oder an der Grenze zwischen C# und dll wird falsch konvertiert...
Muss ich es irgendwie einstellen, wie die strings aus einer anwendung an eine Dll übergeben werden??

Wass mache ich verkehrt??

Schöne Grüße + Danke

Aldababsack

23.05.2006 - 12:39 Uhr

Hallo

Ich versuche auf eine (nicht COM )DLL zuzugreifen.
Die DLL ist in C geschrieben.
Diese DLL ihrerseits greift auf eine config.ini zu, die sich im gleichem Verzeichnis , wie diese besagte DLL befindet.

In einem "Altem CMD programm" gibt die DLL auf der debug Schnitstelle folgendes


Repository: Main Program Path = '.'
Repository: Using configuration file '.\config.ini'

bei meinem versuchen aus C# sieht die gleiche Ausgabe so aus ;


Repository: Main Program Path = ''
Repository: Using configuration file '\config.ini'
Config file does not exist!!!!!

Es fehlt also der Punkt "."

Wird die DLL in irgendeine sandbox versteckt, oder warum kann die DLL ihren eigenen Pfad (also "." ) nicht finden

Gruß und dank

Aldababsack

18.05.2006 - 18:45 Uhr

DANKE!!

War ein sehr guter tip.

es hat sich herausgestellt, das der Entrypoint " _MasterInitialize" heißt.
(man beachte das underline)

😁 Jetzt Gehts 😁
Danke Danke Danke

18.05.2006 - 12:57 Uhr

Wie gasagt, der zugrif auf die DLL ist nicht das problem.
Er findet die DLL. (dank @ zeichen)
Ich habe die DLL vorsichtshalbe aber schon in :

Bin/debug/
Bin/release/
Windows/
Windows/system32/ usw reinkopiert.

Filemon angeschmissen... Er sucht genau da, wo die DLL liegt.
Er greift auch auf die DLL zu.
Habe mal die DLL gelöscht, schon kommt irgendwine meldung mit "datei nicht gefunden... htacces irgendwas..

Was kann da noch nicht IO sein???

Gruß+ Danke

Aldababsack

17.05.2006 - 22:23 Uhr

Hallo
Ich habe eine in C geschrieben DLL, die mit GNU Compiler kompiliert wurde.
auf diese wollte ich zugreifen. ( also nichts mit COM usw.....)

Ich rufe die DLL auf folgende Weise auf:


using System;
using System.Collections.Generic;
using System.Runtime.InteropServices;
using System.Text;

namespace ConsoleApplication1
    {
    class Program
        {
        [DllImport(@"C:\Ordner\master.dll",   EntryPoint="MasterInitialize")]
        
            extern static void MasterInitialize(string myconfgfile, int myschnitstelle);

        static void Main(string[] args)
            {
            
            MasterInitialize("", 2);
            Console.ReadKey();
            }
        }
    }


Nun hier der Korrespondierende Teil aus dem Quelltext der C dll.

#include <vcl.h>
#pragma hdrstop
USEUNIT("..\..\libs\libmaster.c");

//---------------------------------------------------------------------------
extern "C" void Library_Init( void );
extern "C" void Library_Fini( void );

//static int iUseCntr = 0;

int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void*)
{
   switch(reason)
   {
      case DLL_PROCESS_ATTACH:
         //ShowMessage(AnsiString("Using Counter = ") + (++iUseCntr));
         break;

      case DLL_PROCESS_DETACH:
         //ShowMessage(AnsiString("Using Counter = ") + (--iUseCntr));
         break;
   }

   return 1;
}
//---------------------------------------------------------------------------

?( 8o

dies ist also nur ein Verweis ( ?( so wie ich es verstehe ?( ) auf libmaster

und dort steht die eigentlich Funktion, auf die ich zugreifen möchte.

\**************************************************************************/
void EXPORTDLL MasterInitialize(char * myconfgfile,DWORD * myschnitstelle )
{
   irgendwas blah blah ;
}

Wenn ich nun die DLL aufrufe, kommt eine Meldung, die besagt „der Einstiegspunkt MasterInitialize konnte nicht gefunden wurden".
😜 8o X(

Was ist da verkehrt gelaufen??
Ich habe nur marginale C Kentnisse , bin also für jede Hilfe dankbar.
Die ganze DLL wurde von einem Profi ca 3 monate Programiert, ist also extrem umfangreich.
PS:
habe es auch mit "ref" bei Aufruf probiert... (ref passt wahrschinlich besser , wegen des " * " also Verwises in C)
Keine Probs beim zugrif auf die DLL. ( danke Filemon 😉 )
Visual Studio Express 2005
Kein Gnu Compiler zu hand 😉

Gruß + Danke
Aldababsack