Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Portal
  • |
  • Mitglieder
Beiträge von bredator
Thema: COM-Interop-Problem: Programm "hängt" auf einem anderen Rechner
Am im Forum: Rund um die Programmierung

Wie gesagt, so weit komme ich gar nicht erst. In dem Moment, wo quasi der DllImport kommt, bzw. die Methoden aus der importierten Dll aufgerufen werden sollen, hängt das Programm. Keine Exception oder sonstwas, die Nachrichtenverarbeitung findet gar nicht mehr statt.

Thema: COM-Interop-Problem: Programm "hängt" auf einem anderen Rechner
Am im Forum: Rund um die Programmierung

Hallo zusammen,

momentan soll ich für eine native Applikation das Auslesen einer elektronischen Gesundheitskarte umsetzen. Da ich sowas schonmal halbfertig rumliegen hatte, habe ich das Projekt herangenommen und fertiggestellt. Es handelt sich um eine Dll, die aus dem nativen Code aufgerufen wird und ein String-Array zurückgibt. Die Technik dahinter ist nicht weiter aufregend. Es wird ein Interface definiert und dadurch bekomme ich auf nativer Seite den Pointer zur Klasse und kann die Methoden aufrufen. Ähnlich wird das schon an etwa 4-5 weiteren Stellen der nativen Anwendung so gemacht.

Der einzige Unterschied zu den bisherigen .NET-Komponenten ist der, dass dies die erste ist, die DllImport nutzt. Um den Kartenleser anzusprechen (via CTAPI) brauche ich die entsprechende Dll:


[DllImport(@"CTPCSCCD.dll", EntryPoint = "CT_init", SetLastError = true)]
        private static extern sbyte CT_init(ushort ctn, ushort pn);

        [DllImport(@"CTPCSCCD.dll", EntryPoint = "CT_close", SetLastError = true)]
        private static extern sbyte CT_close(ushort ctn);

        [DllImport(@"CTPCSCCD.dll", EntryPoint = "CT_data", SetLastError = true)]
        private static extern sbyte CT_data(ushort ctn, ref byte dad, ref byte sad, ushort lenc, ref byte command, ref ushort ulenr, ref byte response);

Das Problem ist nun: Auf dem Entwicklungsrechner funktioniert der Aufruf der entsprechenden Methode völlig unproblematisch. Auch auf einem anderen Entwicklungsrechner geht das perfekt. Gehe ich nun allerdings an einen anderen Rechner (native Exe + .NET-Dll + CT-API-Dll) und führe die Schritte dort durch, hängt die native Anwendung und es passiert nichts mehr. Per remote Debugger sehe ich, dass ich den Pointer auf meine Dll korrekt bekomme, allerdings beim Aufruf der eigentlichen Hauptmethode hängt sich die Anwendung auf. Keine Debug-Ausgabe auf der Konsole, keine Return-Werte, einfach überhaupt nichts mehr.

Der Aufruf sieht auf nativer Seite so aus:

CoInitialize(NULL);
this->s_ptrApoCT = ApoCT::_IApoCTAPIPtr(__uuidof(ApoCT::CardTerminalClient));
SAFEARRAY * test1 = s_ptrApoCT->getEgkData();

Wie gesagt, den Pointer erhalte ich. Erst bei getEgkData() steht das Programm. Und das nur auf den nicht-Entwickler-Rechnern.

Um einen generellen Fehler der .NET-Dll auszuschließen habe ich eine schnelle Winforms-Anwendung gezimmert, die Dll dort eingebunden und dieselbe Methode von dort aus aufgerufen. Das funktionierte dann auf sämtlichen getesteten Rechnern völlig unproblematisch. Die entsprechend benötigten Dlls sind also alle vorhanden und funktionieren auch. Nur aus nativem Code nicht so richtig.

Die Frage ist nun, was habe ich übersehen? Gibt es etwas, worauf ich achten muss, wenn ich aus nativem Code eine .NET-Dll aufrufe, welche wiederum native Dlls nutzt? Mein Verdacht ging schon in Richtung GC, dass dieser mir meine Dll im Hintergrund schon wieder abgeräumt hat, bis ich die Methode aufrufen will und das Ganze dann ins Leere läuft. Allerdings fehlt mir auch hier das Wissen um das entweder zu verhindern oder zumindest es genau herauszufinden.

Thema: Verzweigtes Array: Element löschen
Am im Forum: Grundlagen von C#

Vergiss am besten ArrayList ganz schnell wieder. Untypisierte Arrays sind einfach nur schlecht und sollten keinesfalls mehr genutzt werden. Ich bin mir auch sicher, dass davon der Ausbruch gefährlicher Tropenkrankheiten gefördert wird.

Nein, ganz ehrlich. Nutz List<T>

Thema: Landkarten mehrfarbig einfärben
Am im Forum: Smalltalk

Schau mal, ob du mit der Google GeoChart-API was anfangen kannst:

Google GeoChart

Thema: Control-Fokus wechseln mit Enter-Taste
Am im Forum: GUI: Windows-Forms

Hast du dein Event normal über den Designer abonniert? Falls nein, solltest du das im Code machen.

Thema: Control-Fokus wechseln mit Enter-Taste
Am im Forum: GUI: Windows-Forms

Keine Ahnung, was du dann machst. Funktioniert bei mir mit demselben Code anstandslos.

Thema: Zeichen entgegennehmen und speichern
Am im Forum: Rund um die Programmierung

Zitat von Tomatengewächs
Kannst du mir ev. ein Beispiel schicken?

Nun, wenn du schreibst, du empfängst Zeichen, gehe ich von einzelnen Characters aus. Aber auch wenn du solche Texte bekommst, ist das doch erst mal relativ einfach, da mal schnell durch alle Chars zu iterieren und zu prüfen, ob es ein erlaubtes Zeichen ist?

Pseudocode:

foreach (char c in Quelle)
{
   if (ZeichenErlaubt(c))
   {
        this.Speicher.Text += c;
   }
}

Thema: Zeichen entgegennehmen und speichern
Am im Forum: Rund um die Programmierung

Regex? Eingabe auf Gültigkeit prüfen und entweder anhängen oder eben nicht.

Thema: PC zum Programmieren gesucht
Am im Forum: Smalltalk

Zum einen das und zum anderen sollte man die Entwicklungszeit von so einem Spiel nicht unterschätzen. Ich kaufe für die Entwicklung jetzt eine aktuelle High-End-Karte, bis das Spiel aber "fertig" ist, hat jede Mittelklasse-Karte dieselbe Leistung. Das macht schon Sinn, die Entwicklung auf großen Karten zu beginnen.

Thema: Zugriff auf Quellcode des Programms
Am im Forum: Rund um die Programmierung

Ist es ein .NET Projekt? Wenn ja, dann gibt es mit Reflector, DotPeek und dergleichen genügend Tools, um an den Code zu kommen.

Bei nativem Code wird das ungleich schwieriger, eher sogar unmöglich.

Thema: PC zum Programmieren gesucht
Am im Forum: Smalltalk

Wenn weiterhin 3DS Max + alles andere gleichzeitig laufen können soll, dann ja.

Thema: Kurs: "Geprüfte/r C# Software-Entwickler/in" (Erfahrungen/Meinungen gesucht)
Am im Forum: Smalltalk

Ich habe den Kurs bei SGD gemacht (2008) und war damit im Wesentlichen ganz zufrieden. Es ist halt ein reiner Einstieg, das richtige Lernen ging erst danach los. Aber es werden einem alle Kenntnisse vermittelt, die man für den weiteren Aufbau benötigt.

Wertschätzung habe ich eigentlich relativ wenig dadurch erfahren. Es ist halt ein Kurs und damit hatte es sich schon. Wertschätzung habe ich nur für die Arbeit erhalten, die ich darauf aufbauend dann geleistet habe. Im Nachhinein hätte ich mir diese Kenntnisse aber tatsächlich auch mit einem guten Buch für 50-60 Euro aneignen können. Aber ja, auch ich bin öfters mal gern faul und brauche einen gewissen Druck dahinter, weshalb ich dennoch den Kurs gewählt habe. Auch die Möglichkeit mit den Einsendeaufgaben konkretes Feedback zu meinen Schwachstellen zu erhalten, war dabei ausschlaggebend.

Thema: Sich überschneidende Regex-Matches finden?
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Ah ok, ich würde mich also von einem ersten Zeichen ausgehend weiter durchtasten und das erste Zeichen verwerfen (+Matching von vorne), wenn es nicht passen sollte? Das sollte eigentlich machbar sein. Danke für den Anstoß ;)

Thema: Sich überschneidende Regex-Matches finden?
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Also, der Teil, den ich aus der OCR erhalte ist Teil eines Formulars. In diesem Formular ist ein Datum gedruckt im Format TTMMYY. Dazu ist aber auch noch alles mögliche andere aufgedruckt oder reingekritzelt. Daher soll das Datum irgendwie rausgehoolt werden aus diesem Zeichengewirr. Es gibt natürlich auch den Fall, dass etwas über das Datum gedruckt wurde, aber das sind jene Fälle, die ich ignorieren kann und muss. Allerdings habe ich auch in Ausnahmefällen schon gesehen, dass das Datum auch mit TT.MM.YY aufgedruckt sein kann. Diesen Spezialfall abzudecken wäre aber erst in der 2. Stufe interessant, da er wohl recht selten auftritt...

Daher dachte ich mir, dass ich diesen Regex ja von mir aus schon möglichst einschränken kann. Und zwar so:

1. Stelle: 0-3
2. Stelle: 0-9
3. Stelle: 0-1
4. Stelle: 0-9
5. Stelle: 1-2
6. Stelle: 0-9

Damit kann ich Datumsangaben bis 2029 abdecken, was die Laufzeit der Software wohl überschreiten würde. Evtl. kann ich aus 1-2 noch 1-3 machen an der 5. Stelle, dann wäre 2039 als Enddatum angesagt.

Wie gesagt, der Teil, den ich aus der OCR erhalte ist fix und daran kann ich am Code auch leider nichts ändern. Ebenfalls der Bildausschnitt, da der von dem Programm um die OCR herum festgelegt wird (sonst hätte ich versucht, diesen exakter um das Datumsfeld zu platzieren - aber da die Bedruckung nicht immer 100%ig platziert ist, wäre auch das erst mal problematisch).

In meinem Beispiel würde mit meinem Pattern allerdings die Zeichenkombination [lItl/x1i][1Itl/x][9oO030][0oO0][1Itl/x2][1Itl/x] gefunden. Nach Extraktion der jeweils ersten Zahl aus jeder Gruppe würde hier allerdings 119011 als Datum herauskommen. Die führende 1 kommt von erwähntem Gekritzel und unsauberem Bedrucken, die OCR kann das in bestimmten Fällen nicht unterscheiden.

Das Parsen schlägt logischerweise fehlt und ich habe kein Datum als Ergebnis. Es wird jetzt allerdings von der Regex-Klasse alles ignoriert, was bei einem vorherigen Match schonmal betroffen war. Die gesamte Gruppe vom ersten (falschen) Datum fliegt raus und aus dem Rest ergibt sich kein weiterer Match. Besser fände ich, wenn ALLE möglichen Matches aus dem gesamten Eingabestring gefunden werden würden - also [lItl/x1i][1Itl/x][9oO030][0oO0][1Itl/x2][1Itl/x] und [1Itl/x][9oO030][0oO0][1Itl/x2][1Itl/x][53S]. Bei letzterem würde das Parsen des Datums funktionieren und die Plausiprüfung (darf nicht in der Zukunft liegen) wäre erfolgreich. Ich hätte mein Datum.

Falls sich da von Seiten der Regex-Klasse nichts anbietet, werde ich halt den umständlichen Weg gehen und meinen Eingabestring so lange um je eine Zeichengruppe verkürzen, bis ich ein passendes Ergebnis habe (bis hin zu "Es gibt kein Ergebnis"). Möglich wäre zwar auch (in diesem Beispiel) den Regex von rechts nach links laufen zu lassen. Da finde ich zwar dieses Datum, allerdings kann mir dasselbe Problem natürlich auch hier in die Quere kommen.

Wie gesagt, war eher als Frage gemeint, ob ich da einfach was übersehen habe, was mir die Arbeit erheblich erleichtern könnte. Man lernt ja immer gerne mal was dazu. Aber im Zweifelsfall gehe ich halt den etwas holprigeren Weg und komme damit ebenfalls an mein Ziel ;)

Edit: Ja, Regex Studio ist bei mir immer in Gebrauch, da einfach bequemer. Vor ein paar Jahren noch habe ich mich gefragt, wozu man so ein Tool brauchen könnte, aber inzwischen will ich nicht mehr ohne ;)

Thema: Sich überschneidende Regex-Matches finden?
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Hi zusammen,

ich habe aus einer OCR eine Ausgabe erhalten, die wie folgt aussehen kann:

[cre][lItl/x1i][1Itl/x][9oO030][0oO0][1Itl/x2][1Itl/x][53S][HMNRBER][0oO0][HMNRBE2][HMNRBEK][0oO0][tItl/xi(][HMNRBEhbL]

Dieser Teil des Programms ist fix, ich kann da keinen Einfluss auf die Ausgabe nehmen. Nun habe ich aus diesem Kram (zwischen den Eckigen Klammern sind alle Möglichkeiten, die ein Zeichen laut OCR haben kann) mittels Regex ein Datum extrahiert. Der Regex sieht bisher so aus:

\[[\w\(\)\/]{0,7}[0-3]{1}[\w\(\)\/]{0,7}\]\[[\w\(\)\/]{0,7}[0-9]{1}[\w\(\)\/]{0,7}\]\[[\w\(\)\/]{0,7}[0-1]{1}[\w\(\)\/]{0,7}\]\[[\w\(\)\/]{0,7}[0-9]{1}[\w\(\)\/]{0,7}\]\[[\w\(\)\/]{0,7}[1-2]{1}[\w\(\)\/]{0,7}\]\[[\w\(\)\/]{0,7}[0-9]{1}[\w\(\)\/]{0,7}\]

Funktioniert bei einem Großteil der Daten auch ganz gut. Allerdings in diesem Beispiel hier nicht, da dieser Regex auch ein "Zeichen" vorher matcht. Herauskommen würde dann 119011, was natürlich für ein Datum eher ungünstig ist. Einen weiteren Match gibt es allerdings nicht, da die gematchten Teile bei der weiteren Untersuchung nicht mehr berücksichtigt werden. Nun ja, klar könnte ich jetzt an dieser Stelle eine Datumsprüfung machen und anhang des Index des Matches dann einen neuen Eingabe-String bauen, auf den dann wiederrum geprüft wird usw. Aber ich frage mich halt, ob das nicht auch einfacher geht. Kann man dem Regex nicht irgendwie sagen, dass er auch bereits gematchte Teile für weitere Matches berücksichtigen soll?

Gruß

Thema: Stack Overflow auf Deutsch
Am im Forum: Szenenews

Ich sehe das ähnlich wie Abt, wer mit Programmieren seine Brötchen verdienen will oder auch etwas mehr hobbymäßig machen möchte, der muss der englischen Sprache mächtig sein. Für den einfachen Einstieg gibt es hunderte deutschsprachige Bücher und für etwas ambitioniertere Projekte muss man sich halt sprachlich weiterentwickeln. Zumal ich das Meiste als eher einfaches Englisch einstufe - die Beiträge sind selten in Prosa- oder Gedichtform oder auf Altenglisch verfasst, das kann man gut lesen, auch wenn man kein Muttersprachler ist.

Auch mich nicht falsch verstehen, ich bin oft dankbar für deutschsprachige Ressourcen zu einem bestimmten Thema. Aber gerade wenn es so richtig ans Eingemachte geht, dann gibt es eben nicht anderes als Englisch. Damit muss man sich einfach abfinden.

Thema: Suche guten Obfuscator! Exe soll nicht als Virus erkannt werden!
Am im Forum: Entwicklungs- und Laufzeitumgebung (Infrastruktur)

Wir haben inzwischen Obfuscatoren wieder abgeschafft und sind dazu übergegangen, uns ein paar Blackbox-Dlls in nativem C++ zu schreiben, die von C# angesprochen werden. Darin befindet sich essentielle Logik und an die kommt man dann nicht mehr ganz so einfach.

Thema: Obfuscator für Sourcedateien (*.cs)
Am im Forum: Entwicklungs- und Laufzeitumgebung (Infrastruktur)

Für Obfuscation ist C# bzw. .NET einfach die falsche Adresse, das lässt sich in den meisten Fällen problemlos wieder in lesbaren Code umwandeln. Variablen umbenennen ist für einen geübten Entwickler pillepalle. Und wer dann gar noch mit IL-Code umgehen kann, dem ist die Verschleierung eh relativ egal.

Warum willst du es schwer machen, den Code zu verändern? Hat das einen bestimmten Zweck? Falls du Zugriff auf das Hauptprogramm und damit die Laderoutine hast, kannst du dir was überlegen mit Hashes den Code zu prüfen, ob er noch dem entspricht, was du geschrieben hast. Aber auch das dürfte nicht unglaublich schwer zu knacken sein. Ist halt so.


Schau dir Perl oder C an, damit kann man wunderschön verschleiern ;)
International Obfuscated C Code Contest

Thema: Ist ein eigener return-Type bei COM-Interop möglich?
Am im Forum: Rund um die Programmierung

Bisher kein Weiterkommen über diesen Weg. Ich werde mir mal die Lösung anschauen, über eine Zwischen-DLL in C++/CLI zu gehen. Trotzdem danke schonmal.

Thema: Übergabe von C# String-Array zum Füllen durch/an C++ Dll? AccessViloation
Am im Forum: Rund um die Programmierung

Ich hab das vor einiger Zeit mal mit einer kleinen Struktur gelöst, als "Geht das überhaupt?"-Projekt. Vielleicht kannst du daraus was lesen, was dir weiterhilft.


static class Program
    {
        [DllImport("Unmanagedtest.dll", CallingConvention = CallingConvention.Cdecl)]
        unsafe public static extern int Modify(IntPtr taest);

        [DllImport("Unmanagedtest.dll", CallingConvention = CallingConvention.Cdecl)]
        public static extern int Multiply(int i, int j);

        unsafe static void Main(string[] args)
        {
            testgedings tast = new testgedings();
            tast.iArgh = 5;
            tast.iBrgh = 10;
            tast.strBla = "Sers";

            arr[] ah = new arr[2];
            ah[0] = new arr();
            ah[1] = new arr();
            ah[0].haha = 1;
            ah[0].strInner = "Ich bin 1";
            ah[1].haha = 2;
            ah[1].strInner = "Ich bin 2";
            tast.harr = ah;

            int size = Marshal.SizeOf(typeof(testgedings));
            for (int i = 0; i < tast.harr.Length; i++)
            {
                size += Marshal.SizeOf(tast.harr[i]);
            }
            IntPtr unmanagedAddr = Marshal.AllocHGlobal(size);

            Marshal.StructureToPtr(tast, unmanagedAddr, true);

            Modify(unmanagedAddr);

            Marshal.PtrToStructure(unmanagedAddr, tast);

            Marshal.FreeHGlobal(unmanagedAddr);
            unmanagedAddr = IntPtr.Zero;
        }
    }

    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
    public class testgedings
    {
        public int iArgh;
        public int iBrgh;
        [MarshalAs(UnmanagedType.BStr, SizeConst = 100)]
        public string strBla;
        [MarshalAs(UnmanagedType.ByValArray)]
        public arr[] harr;
    }

    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
    public class arr
    {
        public int haha;
        [MarshalAs(UnmanagedType.BStr, SizeConst = 100)]
        public string strInner;
    }

Die C++ Methode sah bei mir so aus:

int __declspec(dllexport) Modify(teststruct * tst){

std::wstring sr (L"Harlow!");
tst->iArgh = 299;
tst->iBrgh = 999;
tst->strBla = SysAllocString(sr.c_str());
arraydings ha;
ha.hirgl = 9999;
std::wstring si(L"Ich bin innen");
ha.strInner = SysAllocString(si.c_str());
tst->arr = ha;	

arraydings aha;
SafeArrayGetElement(tst->sfarr, 0, &aha);
std::wstring si1(L"Ich bin 1 NEU");
aha.strInner = SysAllocString(si1.c_str());
	
return 1;
};

Ich weiß, das ist furchtbar lesbar mit meinen Bezeichnern, aber ist jetzt halt rein aus unserem POC-Projekt rauskopiert.

String-Arrays aus C# haben wir auf C++ Seite immer als SAFEARRAY behandelt. Darin liegen BSTR-Objekte, mit denen man arbeiten kann.

Thema: Ist ein eigener return-Type bei COM-Interop möglich?
Am im Forum: Rund um die Programmierung

Hallo zusammen,

mal wieder das leidige Thema COM-Interop/Schwarze Magie. Ganz grob zu meinem System: Wir haben eine große Warenwirtschaft, die in C++ mit der MFC geschrieben wurde. Aufgrund der teils nervtötenden Umwege, die man für viele Dinge gehen muss (die man aus .NET gewohnt ist), haben wir uns entschieden, diverse Sachen in .NET-Dlls auszulagern, also eigentlich in COM-Komponenten. Das funktioniert bei zwei Komponenten bisher ganz gut, da diese nichts weiter tun, als Daten aufzubereiten und darzustellen. So weit so gut.

Bei der jetzt geplanten Komponente sollen allerdings die Daten nicht direkt in der Komponente als Endstation abgelegt werden, sondern in der Warenwirtschaft weiter verwendet werden. Dazu sollen Strukturen hin und her geschubst werden (also C++-WaWi <-> .Net-Dll). Wenn ich jetzt auf der .NET Seite meine Klassen soweit fertig geschrieben habe, diese mit


[StructLayout(LayoutKind.Sequential)]
[ComVisible(true)]
versehen habe und ansonsten auch alles, wie bei den anderen Komponenten gemacht habe, dann wird mir ja von VS die Type Library ausgegeben und die Dll registriert. Einen Pointer bekomme ich auch wunderbar zurück und auch simple Anfragen und Rückgaben funktionieren. Also bool, integer und auch string-Arrays (BSTR-Arrays) sind problemlos möglich.

Das Problem kommt auf, wenn ich eine eigene Klasse als Rückgabetyp verwenden möchte. Das sieht dann so aus:


public KeyListe HoleKeyListe()
{		
	KeyListe keys = MethodeUmKeyListeZuErstellen();
	return keys;		
}


[StructLayout(LayoutKind.Sequential)]
[ComVisible(true)]
public class KeyListe
{
	[MarshalAs(UnmanagedType.SafeArray, SafeArraySubType = VarEnum.VT_BSTR)]
	public string[] key_paulist;
	[MarshalAs(UnmanagedType.SafeArray, SafeArraySubType = VarEnum.VT_BSTR)]
	public string[] key_veblist;
	
	public KeyListe()
	{
		
	}
}

In der .tlh, die mir von der nativen Anwendung aus der TypeLibrary erstellt wird, sehe ich auch die ganzen Schnittstellen beschrieben.

Darin sieht die Klasse KeyListe dann so aus:

struct __declspec(uuid("f8e88956-1b18-3ccf-b290-b4620faf59dd"))
com_KeyListe
{
    SAFEARRAY * key_paulist;
    SAFEARRAY * key_veblist;
};

Methods:
struct KeyListe * HoleKeyListe ();

Mein Gedanke war jetzt, dass es dann doch gehen sollte, diesen com-Typ, der erstellt wurde, in C++ zu nutzen und darin das Ergebnis von HoleKeyListe abzulegen. Das wird mir auch alles brav kompiliert:

KeyListe * keys = s_ptr->HoleKeyListe();

Beim return selbst bekomme ich aber einen TypeMismatch-Fehler. Ich gehe daher einfach mal davon aus, dass es halt doch nicht ganz so einfach zu lösen ist. Jetzt stehe ich allerdings etwas auf dem Schlauch, wie ich jetzt weitermachen soll. Ich habe auch schon ausprobiert, eine Struktur in C++ zu bauen, die derjenigen in C# entspricht und dann einen Pointer auf ein Objekt der Struktur an eine etwas modifizierte C#-Methode weiterzureichen und den Inhalt dann nach einem MarshalPtrToStructure zu bearbeiten. Allerdings mit demselben Ergebnis.

Wie immer will ich nicht unbedingt fertige Lösungen, dazu fuchst mich das Problem zu sehr, als dass ich es nicht verstehen möchte. Ich wäre allerdings für Ansätze dankbar, wie ich z.B. anschauen kann, WAS von der Methode zurückkommt, noch bevor es versucht wird, meinem Pointer auf der C++ Seite zuzuweisen (was ja offenbar erst an dieser Stelle den Type-Mismatch verursacht), so dass ich mir das genauer anschauen kann. Vielleicht finde ich so ja eine Lösung, wie ich das Ergebnis umwandeln muss, um es auf der C++-Seite weiterzuverwenden. Oder ob das überhaupt so möglich ist und ob ich nicht doch ganz was anderes machen muss (was natürlich schon etwas ärgerlich wäre, vor allem, weil es eben so aussieht, als würde nur noch ein winzigkleines Stückchen fehlen für das richtige Ergebnis).

Danke schonmal fürs Lesen und evtl. weitere Zeit, die ihr für mich erübrigt.

Gruß

Thema: Humor: Java Programmierer ... und andere lustige Sachen
Am im Forum: Smalltalk

Kapier ich nicht.

Thema: Microsoft: Visual Studio Community ersetzt Express-Editionen
Am im Forum: Szenenews

Ich fürchte auch... und sei es nur "früher war alles besser" ;)

Thema: Microsoft: Visual Studio Community ersetzt Express-Editionen
Am im Forum: Szenenews

Nun, ich bin schlichtweg begeistert ;)

Damit wurde einigen Kollegen die Argumentationsgrundlage gegen .NET entzogen.

Thema: zip und 7zip Archiv mit C# erstellen
Am im Forum: Rund um die Programmierung

Stimmt, aber der Code ist da, sprich, du kannst das Komprimieren ggf. auch selbst implementieren. Oder eben das SDK mal anschauen, ob du da was brauchbares drin findest.

Thema: zip und 7zip Archiv mit C# erstellen
Am im Forum: Rund um die Programmierung

Es ist auf jeden Fall eine Lösung. Wenn die für dich in Ordnung ist, ist es auch schon die Lösung.

Besser geht natürlich immer. 7Zip hat z.B. ein SDK mit C#-Samples, mit dem man selbst basteln kann. Auch gibt es mit SharpCompress einen Wrapper.

Thema: exel.csv mittels c# importieren/exportieren
Am im Forum: Rund um die Programmierung

Da es sich wohl um eine CSV-Datei handelt, kannst du dir daraus auch ein DataTable bauen und dieses dann editieren. Im Anschluss zurück in eine CSV schreiben und fertig.

Thema: 2 CSV vergleichen, ohne dass enthaltene Musterdatensätze stören
Am im Forum: Rund um die Programmierung

Dann überspring doch das erneute hinzufügen zum Dictionary, wenn die Nummer schon vorhanden ist. Try-Catch könnte da schon helfen. Da kannst du die ArgumentException von Dictionary.Add abfangen und den Datensatz dann halt entsprechend nicht hinzufügen.

Besser ist es aber, die Mustersätze wohl schon vorher auszumachen und gar nicht erst hinzuzufügen. Dass diese kein einheitliches Erkennungsmuster haben, halte ich für unwahrscheinlich oder wenigstens aber unglücklich.

Thema: Per RegEx PDF-Datei finden
Am im Forum: Rund um die Programmierung

Dieser Artikel behandelt das Thema Regex wunderbar und hat mir dabei geholfen, mich darin einzuarbeiten: Regex Tutorial

Aber vom kurz überfliegen des Problems hätte ich gesagt, geht das völlig problemlos.

Thema: GeekBoy - ein GameBoy Emulator programmiert in C#
Am im Forum: Projekte

Zitat von Stefan.Haegele
Gerade das Abspielen auf nicht Nintendo Geräten hat einem - damals - sehr bekannten Gerät große rechtliche Problem bereitet. (Man konnte damit Module auf SD Karten kopieren und diese auch per Adapter wieder im Gameboy/GBA/DS abspielen)

Das ist aber ein völlig anderer Sachverhalt. Hier wird das Schwarzkopieren möglich gemacht, indem man die Spiele - obwohl nicht gekauft - auf der original-Hardware spielt.

Ein Emulator allein ist völlig legal, da er lediglich die Hardware in Software nachbildet. Ein Emulator kann auch dazu genutzt werden, selbst entwickelte Spiele zu testen, bevor man sich evtl. eine Cardridge zusammenlötet.

Generell ist die Rechtslage nicht einfach nur schwarz/weiß bei dem Thema. Nicht mal das Auslesen eines Moduls ist so eindeutig verboten, zumindest hier in Deutschland mit der Privatkopie.