Ich arbeite derzeit an eine DirectSound Wrapper. Ich kam soweit, dass ich Musik abspielen konnte usw. Bei SetVolume gabs dann aber Exceptions dass QueryInterface nicht unterstützt wurde.
Also versuche ich dies zu implementieren. Als dies jedoch nach vielen Versuchen fehlschlug suchte ich nach einer Lösung. Irgendwann fand ich einen Code welcher kein Interface verwendet (wo das Com-Interface ist) sondern nur einen Pointer auf die Com-Instanz.
Hier das Snippit:
BufferCapabilities bc = BufferCapabilities();
Result result = (Result) **(((IntPtr*) nativePointer))[(int) (((IntPtr) 3) * sizeof(void*))](nativePointer, (IntPtr) &bc);
//nativePointer ist die Cominstanz des DirectSoundBuffers.
Also frage ich mich. Wie ist es möglich, dass da hinten noch (nativePointer, (IntPtr)&bc) ein Methodenaufruf gemacht wird. Nämlich dieser: IDirectSoundBuffer::GetCaps
Also wie ist das möglich. In meiner Ide wird das vorallem auch als falsch angestrichen. Doch offensichtlich funktioniert es.
Ein Methodenaufruf ist intern auch nur ein Sprung an eine bestimmte Adresse. Oder an einen Namen, zu dem der JIT oder eine Methodentabelle die Adresse rausfinden muss, bevor da hin gesprungen werden kann.
Wenn man diese Adresse selber rausfindet, kann man durch dieses Konstrukt da anscheinend auch einen Aufruf dieser Methode bewirken. Bei COM geht das wahrscheinlich deswegen, weil die DLL weiß an welcher Stelle die Methode steht.
Normaleiweise codest du den Aufruf als: springe zur Methode namens xy()
Hier wird angegeben: springe zur Methode an der Stelle 1234.
[Hinweis] Wie poste ich richtig? Punkt 5.
WARUM kompiliert es nicht? "Es kompiliert nicht" ist keine Fehlermeldung.
Wahrscheinlich wirds aber auch nur als unsafe code
funktionieren.
Du hast ja leider nur geschrieben, dass Du es irgendwoher hast - aber nich woher. Damit können wir auch gar nicht die Vorraussetzungen sehen, die der Snippet-Schreiber eventuell erwähnt und Du uns vorenthalten hast.
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
Hallo thefiloe,
vielleicht hilft dir dies weiter:
Marshal.GetDelegateForFunctionPointer-Methode
Grüße
Wenn ich ehrlich sein soll sieht mir das eher nach managed c++ aus..
nö ist komplett in c# geschrieben. Aber in dem fall würdet ihr das marshalen oder?
Im Grund ist eigentlich auch das Problem meinem Interface das Interface IUnknown zu vererben. Wenn ich das jedoch mache bekomme ich immer fehler bei com aufrufen.
hab das grad so
[Guid("00000000-0000-0000-C000-000000000046")]
public interface IUnknown
{
int QueryInterface(ref Guid gidd, out IntPtr ppvObject);
int AddRef();
int Release();
}
wo hast Du denn das Snippet her? ich denke hier fehlen einfach noch ein paar Infos.
das snippit habe ich selbst gemacht.
Ich habe das interface IID_DirectSoundBuffer nach C# portiert. Das funktioniert auch zum musik streamen. Jedoch bei aufrufen wie setvolume bekomme ich eine exception, dass QueryInterface unterstützt werden muss. Also dachte ich erst ich schreib die 3 Methoden einfach in das Interface noch rein. -> ging nicht. Also habe ich ein neues Interface mit dem richtigen GUID erstellt und erbe nun von IUnknown. Jedoch auch das funktioniert nicht. Also bin ich auf die suche gegangen und fand das was in dem thread eig. behandelt wurde.
Irgendwann fand ich einen Code welcher kein Interface verwendet (wo das Com-Interface ist) sondern nur einen Pointer auf die Com-Instanz.
das meinte ich.. wo hast Du diesen Code gefunden?