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
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
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
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
Danke! Danke! Danke!
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
Nicht mal Microsoft darf man trauen.... 8o
So habe ich es von HIER(click) Microsoft übernommen...
Das war mien Problem....
Vielen Dank!
Aldababsack
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
Danke!
MeineBindingSource.SuspendBinding();
table.Rows.Clear();
ConnectToSQL(SQLconnectionString);
fill_new_Collumn();
MeineBindingSource.ResumeBinding()
war genu was ich gebraucht habe!!!
Vielen Dank!
Aldababsack.
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
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
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
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
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
WOW
das ging ja schnell...
SVENSON Lösung works !!!
und auch noch so simpel 🙂
(ich trottel ) 😉
Danke!!!
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
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!!
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
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
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
... AHA......
Danke!!!! 😁 😁 😁
Ich verkompliziere es mir manchmal selber gerne ein wenig.... X(
Vielen Dank!!!
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
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
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
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
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