Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Anonymous

unregistriert

1

11.08.2003, 17:51

"Releasen" einer COM Schnittstelle

HiHo,
kann mir bitte Jemand helfen und mir verraten warum meine Release SingleTon Klasse net funzt?


ddRelease.h:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
class ddRelease  
{
public:
    static ddRelease* Instance();       //Zeiger auf einzige Instanz zurückgeben   
    SafeRelease(IUnknown** ppInterface);    //Sicheres Beenden 

private:
    ddRelease()                  {}
    //Variablen
    static ddRelease    *m_pInstance;   //Zeiger auf einzige Instanz der Klasse
};


ddRelease.cpp:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <DayDreamer.h>

 ////////////////////////////////////////////////////////////////////////
//Variablen initialisieren
ddRelease*  ddRelease::m_pInstance = 0;


////////////////////////////////////////////////////////////////////////
//Zeiger auf einzige Instanz zurückgeben
ddRelease* ddRelease::Instance()
{
    if(m_pInstance == 0)                //Instanz schon vorhanden?
        m_pInstance = new ddRelease();      //Nein. lege neue an
    return m_pInstance;     //Ja. Gib die vorhandene zurück, bzw. die neu Angelegte
}

inline ddRelease::SafeRelease(IUnknown** ppInterface) 
{ 
    if(ppInterface != NULL) 
        if(*ppInterface != 0) { 
            (*ppInterface)->Release(); 
            (*ppInterface) = 0; 
        } 
}


Anwendung, release von D3D und Device Objekt.

Quellcode

1
2
ddRelease::Instance()->SafeRelease(&m_pD3D);
ddRelease::Instance()->SafeRelease(&m_pD3DDevice);



Fehlermeldung:

Zitat


--------------------Konfiguration: Kapitel2_Bsp3 - Win32 Debug--------------------
Kompilierung läuft...
ddD3D.cpp
\DayDreamer\ddD3D.cpp(113) : error C2664: 'SafeRelease' : Konvertierung des Parameters 1 von 'struct IDirect3D9 ** ' in 'struct IUnknown ** ' nicht moeglich
Die Typen, auf die verwiesen wird, sind nicht verwandt; die Konvertierung erfordert einen reinterpret_cast-Operator oder eine Typumwandlung im C- oder Funktionsformat
\DayDreamer\ddD3D.cpp(114) : error C2664: 'SafeRelease' : Konvertierung des Parameters 1 von 'struct IDirect3DDevice9 ** ' in 'struct IUnknown ** ' nicht moeglich
Die Typen, auf die verwiesen wird, sind nicht verwandt; die Konvertierung erfordert einen reinterpret_cast-Operator oder eine Typumwandlung im C- oder Funktionsformat
Fehler beim Ausführen von cl.exe.

Kapitel2_Bsp3.exe - 2 Fehler, 0 Warnung(en)


Ich versteh das nicht ganz, die D3D und Device Schnittstellen sind doch von IUnknown abgeleitet oder, wieso soll ich da noch casten?
Wär nett wenn mir da Jemand helfen könnte, hab echt keine Ahnnung wo ich da ansetzen soll.

MfG
Miguel

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

2

11.08.2003, 17:59

Patrick meinte damals auch, man müsste nicht casten. Muss man aber wohl! Ich glaube man müsste nur dann nicht casten, wenn man die Schnittstelle direkt angibt. Jedoch bei Doppelzeigern ist es wieder nötig. Also beim Aufruf von SafeRelease explzit nach IUnknown** casten.
Oder schreib Dir ein Makro:

#define SafeReleaseXP(x) {ddRelease::Instance().SafeRelease((IUnknown**)((x));}

;D

Anonymous

unregistriert

3

11.08.2003, 18:17

Danke für die schnelle Hilfe. Da ist es doch eigentlich überhaupt sowieso schneller und besser, gleich nur ein Makro zu schreiben, welches immer die Release Methode der jeweiligen Schnittstelle benutzt. So hast Du's ja auch im Buch gemacht:

Quellcode

1
#define TB_SAFE_RELEASE(x)      {if((x) != NULL) {(x)->Release(); (x) = NULL;}} // Sicheres Releasen eines COM-Objekts


Also, Danke nochmal!

Anonymous

unregistriert

4

11.08.2003, 18:21

Hab's wie folgt geschrieben:

Quellcode

1
2
ddRelease::Instance()->SafeRelease((IUnknown**)&m_pD3D);
ddRelease::Instance()->SafeRelease((IUnknown**)&m_pD3DDevice);



Hab aber jetzt ein weiters Problem: :(

Zitat


--------------------Konfiguration: Kapitel2_Bsp3 - Win32 Debug--------------------
Kompilierung läuft...
ddD3D.cpp
Linker-Vorgang läuft...
ddD3D.obj : error LNK2001: Nichtaufgeloestes externes Symbol "public: int __thiscall ddRelease::SafeRelease(struct IUnknown * *)" (?SafeRelease@ddRelease@@QAEHPAPAUIUnknown@@@Z)
Debug/Kapitel2_Bsp3.exe : fatal error LNK1120: 1 unaufgeloeste externe Verweise
Fehler beim Ausführen von link.exe.

Kapitel2_Bsp3.exe - 2 Fehler, 0 Warnung(en)



Danke im vorraus!

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

5

11.08.2003, 18:40

Von welchem Typ ist denn die SafeRelease-Methode? Von garkeinem! Gib mal "void" an. Vielleicht hilft das.

Anonymous

unregistriert

6

11.08.2003, 19:35

Hilft leider nichts!
Warum eigentl. nicht nur ein Makro nehmen?

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

7

11.08.2003, 20:06

Zitat von »"Miguel"«

Warum eigentl. nicht nur ein Makro nehmen?

DU hast doch mit der Klasse angefangen ;)

Lass mal das "inline" weg oder implementiere die Methode gleich direkt in der Klasse:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class ddRelease
{
public:
    void SafeRelease(IUnknown** ppInterface)
    {
        if(ppInterface)
        {
            if(*ppInterface)
            {
                (*ppInterface)->Release();
                (*ppInterface) = 0;
            }
        }
    }

    ...
};

Anonymous

unregistriert

8

11.08.2003, 22:03

:) Direktes Einbinden in die Hesder Datei löst das Problem. DANKE!

Trotzdem habe ich nochmal ne dumme Frage, woher kann denn dieser Fehler kommen?
Welcher bei der Anwendung der D3DXMatrixPerspectiveFovLH Funktion auftritt.

Zitat


ddMatrix.obj : error LNK2001: Nichtaufgeloestes externes Symbol _D3DXMatrixPerspectiveFovLH@20
Debug/Kapitel2_Bsp3.exe : fatal error LNK1120: 1 unaufgeloeste externe Verweise
Fehler beim Ausführen von link.exe.

Kapitel2_Bsp3.exe - 2 Fehler, 0 Warnung(en)


Methode in Klasse ddMatrix:

Quellcode

1
2
3
4
5
6
7
8
9
10
ddMatrix ddMatrix::Projection(const float &fFOV, const float &fAspect, const float &fNearPlane, 

const float &fFarPlane)
{
    ddMatrix mTmp;

    D3DXMatrixPerspectiveFovLH((D3DXMATRIX*)(&mTmp), fFOV, fAspect, fNearPlane, fFarPlane);
    
    return mTmp;
}


Aufruf:

Quellcode

1
2
ddMatrix mProjection;
mProjection = mProjection.Projection(DD_DEG_TO_RAD(90.0f),nfAspect, 0.1f, 100.0f);


Vielen Dank nochma!

C'Ya Miguel

Anonymous

unregistriert

9

11.08.2003, 22:06

Übrigens tritt das Problem auch auf, wenn man die Funkt. nicht aufruft.

10

11.08.2003, 22:18

hasu d3dx9.lib gelinkt?
Ein Gespenst geht um in Europa...

Werbeanzeige