Laden...

Aufruf ohne Methodennamen - wie ist das möglich? [==> per Pointer]

Erstellt von thefiloe vor 11 Jahren Letzter Beitrag vor 11 Jahren 1.527 Views
T
thefiloe Themenstarter:in
87 Beiträge seit 2010
vor 11 Jahren
Aufruf ohne Methodennamen - wie ist das möglich? [==> per Pointer]

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.

C
2.121 Beiträge seit 2010
vor 11 Jahren

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.

T
thefiloe Themenstarter:in
87 Beiträge seit 2010
vor 11 Jahren

wie wird das jetzt aber umgesetzt. bei mir compiliert das nicht.

16.835 Beiträge seit 2008
vor 11 Jahren

[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.

S
248 Beiträge seit 2008
vor 11 Jahren

Hallo thefiloe,

vielleicht hilft dir dies weiter:
Marshal.GetDelegateForFunctionPointer-Methode

Grüße

T
thefiloe Themenstarter:in
87 Beiträge seit 2010
vor 11 Jahren

Fehlermeldung methodenname erwartet.

849 Beiträge seit 2006
vor 11 Jahren

Wenn ich ehrlich sein soll sieht mir das eher nach managed c++ aus..

T
thefiloe Themenstarter:in
87 Beiträge seit 2010
vor 11 Jahren

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();
    }
849 Beiträge seit 2006
vor 11 Jahren

wo hast Du denn das Snippet her? ich denke hier fehlen einfach noch ein paar Infos.

T
thefiloe Themenstarter:in
87 Beiträge seit 2010
vor 11 Jahren

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.

849 Beiträge seit 2006
vor 11 Jahren

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?

T
thefiloe Themenstarter:in
87 Beiträge seit 2010
vor 11 Jahren