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 Spook
Thema: Access Violation bei TCL-Kommandoaufruf über DLL
Am im Forum: Rund um die Programmierung

Hallo dls,

versuche mal die korrekte Calling-Convention für den Tcl_ObjCmdProc Delegaten zu setzen:
UnmanagedFunctionPointerAttribute

Grüße
spooky

Thema: Generischer Vergleich 2er Objekte
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Hallo elTorito,

ich würde Project das Interface IComparable<Project> implementieren lassen (Implementierung deines Comparers).
Danach kannst du aus


public int BinarySearch(T item, IComparer<T> comparer)
        {
            List<T> itemsList = (List<T>)this.Items;
            return itemsList.BinarySearch(item, comparer);
        }


public int BinarySearch(T item)
        {
            List<T> itemsList = (List<T>)this.Items;
            return itemsList.BinarySearch(item);
        }

machen und es sollte automatisch deine Implementierung für die binäre Suche verwendet werden.
Ich hoffe das ist was du suchst.

Grüße
spooky

Thema: Remote Shutdown im Netzwerk möglich?
Am im Forum: Netzwerktechnologien

Hallo KEFHVDI,

dein finaler String für die Argumente enthält nur einen Backslash. Entweder die Backslashes ganz weglassen oder du musst vier nehmen.

Grüße
spooky

Thema: Geschützer Speicher Fehler bei Aufruf einer Nativen DLL mit string Pointer
Am im Forum: Rund um die Programmierung

Hallo Crash129,

dieser Code sollte dir weiterhelfen:


    class Program
    {
        static void Main(string[] args)
        {
            string name = API.GetServerName();
            Console.WriteLine("Servername is {0}.", name);
        }
    }

    public static class API
    {
        [DllImport("API.dll", EntryPoint = "GetServerName", CallingConvention = CallingConvention.Cdecl)]
        private static extern int GetServerName(ref IntPtr buffer);

        public static string GetServerName()
        {
            IntPtr buffer = Marshal.AllocHGlobal(1024);
            try
            {
                int returnCode = GetServerName(ref buffer);
                // Mögliche Fehlerbehandlung
                // if (returnCode < 0)
                //    throw new Exception();
                return Marshal.PtrToStringAnsi(buffer);
            }
            finally
            {
                Marshal.FreeHGlobal(buffer);
            }
        }
    }

Die Methode gibt bei mir das erwartete "Unbekannt" zurück, siehe original Code:
int SAMP::API_GetServerIP(char *&serverip) {
	char ip[15] = { "Unbekannt" };
	if (_Memory.CheckHandles() == 1) {
		_Memory.Read((DWORD*)(_Memory.GetSAMPBaseAddress() + SAMP_SERVERIP_ADDR), &ip, sizeof(ip));
	}
	memcpy(serverip, ip, sizeof(ip));
	return _Memory.CheckHandlesErrorCode;
}

Ein Wrapper bringt hier glaube ich nur einen unnötigen Mehraufwand. Wenn die API nur reine C++ Klassen exportieren würde, dann müsste man den Weg über eine CLI-DLL gehen, aber wegen drei Methoden halte ich dies für etwas übertrieben.

Grüße
Spooky

Thema: Durchreichen von Referenzen nach C++ DLL über eine managed C++ Schicht
Am im Forum: Rund um die Programmierung

Bei mir waren beide Funktionen im gleichen (C++/CLI) Projekt.
Ich konnte deinen Fehler nachstellen, und auch beide Lösungen haben funktioniert.

Kannst du mal deine Wrapper-Methode umbennen, so dass nicht beide den gleichen Namen haben. Vielleicht ist dies ein Teil des Problems.

Grüße

Thema: Durchreichen von Referenzen nach C++ DLL über eine managed C++ Schicht
Am im Forum: Rund um die Programmierung

Hallo Almeida,

die Typen scheinen wohl nicht kompatibel zu sein.
Du kannst dies aber so lösen:


short getParameters(bool% isA, bool% isB, bool% isC)
{
	bool a = isA;
	bool b = isB;
	bool c = isC;
	short result = nativeDll::getParameters(a, b, c);
	isA = a;
	isB = b;
	isC = c;
	return result;
}

Edit:

Wenn du es in einer Zeile machen möchtest, kannst du die Kompatibilität auch erzwingen:
short getParameters(bool% isA, bool% isB, bool% isC)
{
	return ((short(_cdecl*)(bool%, bool%, bool%))&nativeDll::getParameters)(isA, isB, isC);
}

Dabei aber die korrekte Calling Convention der nativen Funktion verwenden.

Grüße
spooky

Thema: Child Process ID von mstsc abfragen
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Hallo logan517,

wie herbivore geschrieben hat liegt es daran, dass die Anwendung sich selbst nocheinmal startet (habe ich an meinem Rechner getestet).
Dies hättest du leicht mit Refresh und HasExited herausfinden können.

Das hier sollte dir weiterhelfen:
Unterprozess finden

Hallo Abt,

die Process Klasse cacht die Prozess-ID intern, daher bringt der Code leider nicht so viel


Grüße
spooky

Thema: serielle Schnittstelle einlesen - unterschiedliche Anzahl von Zeichen
Am im Forum: Rund um die Programmierung

Hallo MailoKooiker,

erzeuge ein Byte-Array mit der genwünschten Größe und fülle dieses mit Hilfe der Stream.Read Methode in einer while-Schleife so lange, bis dieses komplett gefüllt ist (die Methode muss nicht die angeforderte Anzahl liefern) oder Read den Wert 0 zurück gibt (dein Fehlerfall).
Dabei musst du offset und count nach jedem Durchlauf anpassen.

Grüße
spooky

Thema: C - void-Pointer mit Typ-Größe auslesen
Am im Forum: Rund um die Programmierung

Wenn du den Zeiger und die Größe hast, sollte es so gehen:

VOID SetArrayElement(LPVOID dst, SIZE_T elementSize, INT index, LPVOID src)
{
	memcpy((LPBYTE)dst + (index * elementSize), src, elementSize);
}

Grüße
spooky

Thema: [gelöst] DllImport: Array mit bestimmter Größe in Funktions-Deklaration?
Am im Forum: Rund um die Programmierung

Zwei Möglichkeiten:
Unterschiedliche CallConv zwischen C++/C#.
Du speicherst den Delegaten nicht, wie es weismat dir geraten hat.

Bei mir funktioniert der Code, siehe angehängtes Projekt.
Nun sollte es doch möglich sein, den Fehler zu finden ...


Grüße
spooky

Thema: [gelöst] DllImport: Array mit bestimmter Größe in Funktions-Deklaration?
Am im Forum: Rund um die Programmierung

Mein Vorschlag wäre Folgender:

Erstelle in C++ eine Struct mit 3 Werten und verwende diese anstatt eines mehrdimensionalen Arrays. Zusätzlich solltest du die Aufrufkonvention für die Callback-Funktion angeben (WINCC):

struct PositionData
{
	double v0;
	double v1;
	double v2;
};

typedef void (WINCC* FPS_PositionCallback) ( unsigned int   devNo,
                                        unsigned int   length,
                                        unsigned int   index,
					PositionData * positions);

Der 'length' Parameter gibt die Länge des Arrays an.

In C# definierst du die Struct nochmal genau so und änderst Definition der Callback-Methode:

public struct Positions
{
    public double v0;
    public double v1;
    public double v2;
}

[UnmanagedFunctionPointer(CallingConvention.StdCall)]
public unsafe delegate void FPS_PositionCallback(uint devNo, uint length, uint index, Positions* position);

[DllImport("TestDll.dll")]
public static extern int setPositionCallback(uint devNo, FPS_PositionCallback callback, uint lbSmpTime);

Damit sollte es funktionieren.

Solltest du kein Unsafe verwenden wollen, so kannst du im C# den Parameter auch als IntPtr definieren und so verwenden:

[UnmanagedFunctionPointer(CallingConvention.StdCall)]
public delegate void FPS_PositionCallback(uint devNo, uint length, uint index, IntPtr position);

[DllImport("TestDll.dll")]
public static extern int setPositionCallback(uint devNo, FPS_PositionCallback callback, uint lbSmpTime);

static void Test(uint devNo, uint length, uint index, IntPtr position)
{
    // Speicher anlegen
    double[] data = new double[length * 3];
    // Daten in C# Array kopieren
    Marshal.Copy(position, data, 0, data.Length);

    // Was tolles machen
    for (int i = 0; i < data.Length; i++)
    {
        data[i] = i;
    }

    // Daten zurück kopieren
    Marshal.Copy(data, 0, position, data.Length);
}


Grüße
spooky

Thema: [gelöst] DllImport: Array mit bestimmter Größe in Funktions-Deklaration?
Am im Forum: Rund um die Programmierung

Warum definierst du nicht das Array als ganz simples eindimensionales Array (double*) mit der Länge (n*3). Damit ist das Marshalling super einfach. Dann kannst du den Parmater als IntPtr definieren, in ein C# Array kopieren und nach der Bearbeitung wieder zurück (falls nötig).

In einem C++ Projekt (ich gehe davon aus, dass du die C++ Dll geschrieben hast) ist die Standard Aufrufkonvention cdecl. Dies kannst du global im Projekt umstellen (da du nicht weisst was dies ist, gehe ich davon aus, dass du es nicht gemacht hast). Ansonsten kannst du für jede Methode einzeln die Konvention festlegen.

Poste doch bitte die komplette .h Datei welche die exportierten Methoden beinhaltet. Normalerweise heisst diese <Projektname>.h

Für dich zum Nachlesen:
Aufrufkonvention


Grüße
spooky

Thema: Lebensdauer eines Objekts das nur durch einen Delegaten referenziert wird
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Hallo chilic,

die Referenz auf das Objekt wird in dem dabei erzeugten Delegate mit gespeichert.
Der Delegate enthält immer eine Referenz auf die aufzurufene Methode. Ist die Methode nicht statisch, so enthält er zusätzlich noch das Objekt für welches die Methode aufgerufen werden soll.

Grüße
spooky

Thema: Aktualisierung einer Grafik in WPF
Am im Forum: GUI: WPF und XAML

Hallo,

die GUI wird erst aktualisiert, wenn deine methode "StartAnimation" zurückkehrt. Anstall mit Sleep zu warten, muss du diese zyklisch aufrufen, z.B. mit Hilfe eines Timers (der alle 500ms) ausgelöst wird.

Grüße

Thema: Änderung an ObservableCollection-Items mitbekommen
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Wenn du Änderungen der einzelnen Objekte mitbekommen möchstes muss der Typ der Collection INotifyPropertyChanged implementieren.

Thema: Colorbar mit WPF
Am im Forum: GUI: WPF und XAML

Hallo,

die, meiner Meinung, einfachste Art ist es, das Darstellen der Colorbar und das Zeichnen des Bildes mit der gleichen Farbpalette zu machen (siehe BitmapPalette).
Diese kann dann beliebige Farbübergänge haben.

Den Slider kannst du dann auch relativ einfach zeichnen:
Du nimmst ein Bild mit 1x256 oder 256x1 Pixel mit den Werten 0..255 und wendest auf das Bild deine vorhandene Palette an. Dieses Bild kannst du dann direkt zeichenen oder dynamisch in ein Image einsetzten.

Grüße spooky

Thema: Usb-Stream bzw. Handle wird nicht (richtig) geschlossen: SafefileHandle is invalid beim Neuöffnen
Am im Forum: Rund um die Programmierung

Hallo,

beide Close() Methoden rufen intern Dispose auf. Den Finally-Block kannst du damit weglassen.

Grüße

Thema: byte[] gefüllt mit 0len
Am im Forum: Datentechnologien

Hallo Endro,

ich rate einfach mal:

db.Read())
byte[] buffer = new byte[db.GetBytes(1, 0, null, 0, int.MaxValue)];
db.GetBytes(1, 0, buffer, 0, buffer.Length);
List.Add(new FileModel
                        {
                            Name = db.GetValue(0).ToString(),
                           File = buffer
                     });

Grüße
spooky

Thema: [gelöst] Von GIF zum Stream dann zum ByteArray und dann wieder zu GIF: Bildgröße ändert sich
Am im Forum: Grafik und Sound

Hallo xiconluan,

das Bild hat die folgenden zwei Metadateneinträge:
LogicalHeight: 480
LogicalWidth: 640
(Namen kommen aus FreeImage, ob dies die korrekten Bezeichner laut Spezifikation sind weiß ich nicht).

Je nach Anwendung/Implementierung wird wohl diese Auflösung verwendet beim Lesen/Schreiben des Bildes.

Ich würde mir eine Gif-Spezifikation suchen, und nachschauen wie Metadaten die Größe beeinflussen können.

edit:

Laut FreeImage-Dokumentation sind es keine echten Metadaten, sondern Animationsdaten (die in FreeImage ähnlich wie Exif-Metadaten behandelt werden.

Hier aus der Doku:

Zitat
The Animation metadata model is a generic model used to load and save animation metadata attached to an animated file (such as a GIF or a MNG file).
[...]
LogicalWidth
Width of entire canvas area that each page is displayed in 0-65535
[...]
LogicalHeight
Height of entire canvas area that each page is displayed in 0-65535

Vielleicht hilft dir das weiter, ggf musst du diese Werte auf die "richtige" Größe setzten.

Grüße
spooky

Thema: Internet zwischenzeitlich sehr langsam
Am im Forum: Smalltalk

Dann würde ich mich mal direkt einwählen ohne Router und schauen ob es dann auch auftritt. Wenn nein, hast du den Schuldigen gefunden.

Grüße

Thema: Internet zwischenzeitlich sehr langsam
Am im Forum: Smalltalk

Hi inflames2k,

als erstes würde ich mal alles inklusive NTBA für ~10s vom Strom trennen und dann wieder anschlißen. Wurde mir vom Support empfohlen und hat, zumindest bei meinem Problem damals, geholfen.

Grüße

Thema: [gelöst] generischer Methoden-Rückgabewert <TModel>
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Hallo DuRom,

Model.Project muss TModel implementieren.

Grüße
spooky

Thema: Databinding zu Sigelton Klasse
Am im Forum: GUI: WPF und XAML

Hallo Zakant,

mach mal bitte folgende Änderung:

 <CheckBox Grid.Row="1" Name="cbRandom" Content="Zufällige Wiedergabe" IsChecked="{Binding RandomPlayback, Source={x:Static local:Settings.Instance}}" /> 

dann sollte es gehen; zumindest bei mir ging es dann.

Hallo irgendwas,

lock auf ein Feld das noch null ist beim ersten Zugriff, ist vielleicht keine so tolle Idee ...

private static readonly Settings _instance = new Settings();

Sollte das gewünschte Ergbis bringen und beim getter werden keine ifs oder locks mehr benötigt.

Grüße

Thema: Fenster "Neuzeichnen" nach Änderung in WPF
Am im Forum: GUI: WPF und XAML

Zitat
ja die Schleife läuft im Hauptthread.

Wenn du Operationen im GUI-Thread machst, dann wird die Oberfläche erst dann aktualisiert, wenn ein Benutzer-Code abgearbeitet wurde. Wenn am Anfang dein Bild sichtbar ist, und am Ende deiner Schleife wieder auf sichtbar geändert wird, so hat sich für die Oberfläche nichts geändert, also siehst du auch keine Änderung.
Du musst die Operation in einen 2. Thread auslagern und mit Hilfe des Dispatchers die Visible-Änderungen in den GUI-Thread leiten.

Grüße

Thema: DLLImport funktioniert nur im Debugger, ansonsten AccessViolationException
Am im Forum: Rund um die Programmierung

Hallo weismat, hallo Firewire,

es ist nicht nötig Strings, oder Arrays, zu fixieren für einen PInvoke-Aufruf, die Runtime übernimmt das für einen.

Grüße
spooky

Thema: Zugriff auf eine Sequenz Datei (.seq, Kamera-Daten)
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Bist du über Flir Custhelp gegangen? Wenn nein, solltest es du es da versuchen. Die Reaktionszeit ist normalerweise weniger als 24h.

Grüße
spooky

Thema: [gelöst] DllImport einer C Dll: Aufgerufene Funktion hängt
Am im Forum: Rund um die Programmierung

long __stdcall ApintUsb
CallingConvention = System.Runtime.InteropServices.CallingConvention.Cdecl
Absicht?

Thema: [gelöst] DllImport einer C Dll: Aufgerufene Funktion hängt
Am im Forum: Rund um die Programmierung

Hallo Jochen,

wenn es mit dem von dir im Startpost posteten C-Code funktioniert ohne zu hängen, dann versuche folgendene Definition:


        [DllImport("ap_int_usb.dll", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Ansi)]
        public extern static uint ApintUsb(
            uint ProductNumer,
            uint ChannelNumber,
            string Function,
            double In1, double In2, double In3, double In4, double In5, double In6,
            IntPtr Out1, IntPtr Out2, IntPtr Out3, IntPtr Out4, IntPtr Out5, IntPtr Out6,
            IntPtr myArray, IntPtr Length);

Und mit folgendem Aufruf:

ApintUsb(1, 0, "Init usb", 0, 0, 0, 0, 0, 0, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero);

Dies entspricht 1 zu 1 dem, was du in C gemacht hast.
Wenn es dann immernoch "hängt", dann liegt es nicht am Aufruf, sondern an deiner DLL.

Thema: [gelöst] DllImport einer C Dll: Aufgerufene Funktion hängt
Am im Forum: Rund um die Programmierung

Hallo Jochen1980,

als ersten Schritt solltest du die verwendeten Datentypen überprüfen.
In Calling Win32 DLLs in C# with P/Invoke ist eine allgemeine Einführung in das Thema PInvoke.

Unten findest du auch eine Tabelle welcher C/C++ Datentyp zu welchem C# Datentyp passt.

Grüße

spooky

Thema: ObservableCollection<T> Änderungen aus anderem Thread
Am im Forum: GUI: WPF und XAML

Hallo Taladan,

ich habe mir die Seite angesehen. Das Beispiel passt jedoch nur bedingt zu meinem Problem.
Wie völlig richtig dargestellt wird, muss man bei allen Änderungen an den Daten aus einem anderen Thread auf die 'Umlenkung' in den GUI Thread achten. Das passiert bei mir auch, funktioniert auch ohne Probleme.
Es geht bei mir darum, dass ich die Bindung der Collection an die Listbox trenne, diese sich jedoch nicht von dem CollectionChanged-Event dieser abhängt, oder zumindest nicht sofort. Da ich mit Dispatcher.Invoke(...) arbeite, wird dies auch sicher abgearbeitet, bevor im nicht-GUI Thread Clear() aufgerufen wird.
Ich gehe einfach davon aus, dass wenn ich ItemsSource auf null setzte, dass dann die Bindung gelöst wird, und nicht, für mich nicht feststellbar, irgendwann später.