Laden...
F
flippy08
myCSharp.de - Member
8
Themen
26
Beiträge
Letzte Aktivität
vor 13 Jahren
Dabei seit
08.11.2008
Erstellt vor 13 Jahren

Hallo, ich möchte euch hier meinen kleinen Wrapper für WebP, das Bilderformat von Google vorstellen. Momentan können damit nur WebP Bilder zu einer Bitmap Decodiert werden, der Encoder ist noch nicht Implementiert.
Beispiel um ein WebP Bild in einer PictureBox anzuzeigen:

LibwebpSharp.WebPDecoder dec = new LibwebpSharp.WebPDecoder();
PictureBox1.Image = dec.DecodeBGRA(@"X:\PATH\TO\YOUR\IMAGE.webp");

Den Download, Quelltext und mehr Infos findet ihr auf GitHub:
https://github.com/mc-kay/libwebp-sharp

Viellicht kann es ja jemand gebrauchen =)

Erstellt vor 13 Jahren

I'am fucking love it.
Bisher habe ich mich gedrückt mal was zu schreiben aber die Software ist echt super und macht es super bequem den misst zu machen 😁
Die generierten PDF's sehen wirklich gut aus.
Was jetzt noch der totale Oberhammer wäre wenn du einen Webservice anbieten würdest den man selber Hosten könnte um die Daten in eine MSSQL Datenbank weg zu speichern. Dann könnte ich den Kram gleich zu meinen Webhoster wegsichern und hätte die Täglichen Backups gleich inklusive 8)

TOP jedenfalls weiter so 👍

PS: Wo speichert dein Programm die XML?

Erstellt vor 13 Jahren

Ich benutze jetzt eine andere Funktion bei der ich den Speicher jetzt auch selbst reserviere und dann den Pointer dahin übergebe. Funktioniert genau so und ich kann ihn auch sauber mit FreeHGlobal() freigeben.

Erstellt vor 13 Jahren

Ich habe jetzt nochmal ein wenig rumprobiert und dabei ist mit folgendes aufgefallen:
Statt Error 87 bekomme ich jetzt seit gestern immer Error 1008 nach dem Aufruf von free() geliefert:

ERROR_NO_TOKEN
1008 (0x3F0)
An attempt was made to reference a token that does not exist.

Das komische ist aber das ich das auch bekomme wenn ich SetLastError auf false setzte. Das würde ja bedeuten das dieser Fehler nicht direkt durch den aufruf von free() produziert wird sondern von irgend einer Unterfunktion die dabei aufgerufen wird? Oder liege ich da total falsch?

Erstellt vor 13 Jahren

Joa klar, voll verpeilt:
Also das funktioniert leider auch nicht, gibt Win32 Error 87:> Fehlermeldung:

ERROR_INVALID_PARAMETER
87 (0x57)
The parameter is incorrect.

EDIT:
Ich habe jetzt mal die Funktion GlobalFree probiert, jetzt ist zwar GetlastWin32Error = 0, allerdings ist der Rückgabewert nicht wie in der MSDN beschrieben NULL sondern dort steht immer noch die Speicheradresse was laut MSDN heißt das der Vorgang nicht erfolgreich war:

If the function succeeds, the return value is NULL.
If the function fails, the return value is equal to a handle to the global memory object. To get extended error information, call GetLastError.

Bin ich jetzt ein wenig irritiert...

Erstellt vor 13 Jahren

Ich habe mich nochmal durch den Source gewühlt und dabei folgendes Kommentar gefunden:

The code that calls any of these functions must delete the data buffer (uint8_t*) returned by these functions with free().

Also müsste ich ja nur dir free() Funktion Invoken:

[DllImport("msvcrt.dll", SetLastError = true)]
static extern void free(IntPtr memblock);

Das kann ich auch ohne Fehler ausführen, aber kann ich auch irgendwie überprüfen ob der Aufruf erfolgreich war? Die Funktion gibt mir ja dummerweise nichts zurück...

Erstellt vor 13 Jahren

Hallo, ich greife per P/Invoke auf eine DLL zu um dort eine Funktion auszuführen.
Dazu reserviere ich mir zuerst Speicher mit Marshal.AllocHGlobal() und kopiere anschließend mit Marshal.Copy() ein Byte Array in den Unverwalteten Speicher. Dann übergebe ich der Funktion aus der DLL einen IntPtr mit der Adresse zu diesen Daten. Diese Funktion gibt mir anschließend ebenfalls einen Pointer zu den bearbeiteten Daten zurück die ich ebenfalls wieder mit Marshal.Copy() zurück in den Verwalteten Speicher lade (ein Verwaltetes Byte Array).

Soweit ist auch alles kein Problem, die Daten die ich bekomme sind OK.
Jetzt geht es aber darum den Unverwalteten Speicher mit der Methode Marshal.FreeHGlobal() wieder frei zu geben:
Mit dem von mir selbst mittels Marshal.AllocHGlobal() reservierten Speicher funktioniert das auch, allerdings nicht mit dem Speicher die die DLL Funktion reserviert hat. Dort bekomme folgende Exception:

_COMPlusExceptionCode = -532459699

Um mehr Infos zu bekommen habe ich einen DLL Import auf die Windows Funktion "LocalFree" gemacht, dort bekomme ich diese Fehlermeldung:> Fehlermeldung:

Win32 Error: 998

Die MSDN sagt dazu folgendes:

ERROR_NOACCESS: 998 (0x3E6)
Invalid access to memory location.

Wo daran kann das liegen?

Mein Hostsystem ist Windows 7 x64, die DLL wurde aber für x86 kompiliert und mein Projekt ist auch auf x86 eingestellt.
Wie gesagt funktioniert auch alles korrekt, nur die die Speicherfreigabe macht Probleme. Ob ich es als Administrator oder nicht ausführe macht keinen unterschied.

Erstellt vor 14 Jahren

Das Angebot ist nicht mehr gültig oder?
Ich kann den Code zwar Einlösen aber am Ende des Bestellprozesses wird mir trotzdem der Preis von 11,84€ angezeigt.

Erstellt vor 14 Jahren

@ JAck30lena
Und wie geht das 🤔
Dafür bräuchte man ja "Desktop Interaction" aber das geht ab Windows Vista nicht mehr.