lange nicht mehr gepostet.
Ich spiele gerade mit der VLC-Library herum und habe extreme Probleme einen Bug zu isolieren, der einen ungültigen Speicherzugriff auslöst. Mir ist soweit klar, dass es sich um ein Problem mit der Verwendung von Pseudotypes in Prototypes handelt bei x86-Kompilat. Ich stehe irgendwo auf der Leitung...
Folgender Code-Ausschnitt macht KEINE Probleme, wenn ich eine Exe als "Unicode x64", "Ascii x64" oder "Ascii x86" kompiliere. Wenn ich aber als "Unicode x86" kompiliere dann erhalte ich immer einen illegalen Speicherzugriff an einer scheinbar absolut zufälligen Adresse:
Code: Alles auswählen
Prototype.i libvlc_media_new_path(instance, path.p-ascii) ; <-- hier ist der problematische Pseudotype
Global libvlc_media_new_path.libvlc_media_new_path
;(...)
libvlc_media_new_path = GetFunction(#VLC_DLL, "libvlc_media_new_path")
;(...)
; Hier kommt der IMA!
media = libvlc_media_new_path(instanz, "C:\Users\blabliblub\Downloads\Downloader\Deichkind - Like Mich Am Arsch (Official Video)\Deichkind - Like Mich Am Arsch (Official Video) (1080p).mp4")
Code: Alles auswählen
; Mein eigener "Pseudo-Pseudotype" ;)
Procedure.s PseudoAscii( String$ )
CompilerIf #PB_Compiler_Unicode
PokeS(@String$, PeekS(@String$), -1, #PB_Ascii)
CompilerEndIf
ProcedureReturn String$
EndProcedure
;(...)
Prototype.i libvlc_media_new_path(instance, path$) ; <-- diesmal "normaler" String statt Pseutotype
Global libvlc_media_new_path.libvlc_media_new_path
;(...)
libvlc_media_new_path = GetFunction(#VLC_DLL, "libvlc_media_new_path")
;(...)
; Diesmal KEIN IMA... trotz "Stringgepfusche"... :/
media = libvlc_media_new_path(instanz, PseudoAscii("C:\Users\blabliblub\Downloads\Downloader\Deichkind - Like Mich Am Arsch (Official Video)\Deichkind - Like Mich Am Arsch (Official Video) (1080p).mp4"))
Es scheint auch kein PureBasic-Bug zu sein, denn wenn ich den Prototypeaufruf auf eine eigene Prozedur umleite und den String mit dem MemoryViewer untersuche kann ich keinen Unterschied zwischen "Pseudotype" und "Pseudo-Pseudotype" erkennen... Die Strings sind identisch...