Error: Nicht auflösbares externes '__stdcall...
-
Hallo!
Ich versuche derzeit, ein Codebeispiel aus dem Internet zu benutzen, in welchem eine neue Klasse deklariert wird. Damit es ein wenig übersichtlicher wird, habe ich die Klasse in einer extra .h-Datei gespeichert und füge diese mit #include ein. Die Klasse ist dabei eine Unterklasse von einer Directshow-klasse.
Schreibe ich nun einen Konstruktor für die Klasse in eine neue Funktion in der Hauptdatei, funktioniert alles. Schreibe Ich ihn bzw. den Funktionsaufruf innerhalb einer _fastcall-methode (die werden vom C++-Builder als Objectevents ja immer automatisch angelegt), erhalte ich haufenweise seltsame Fehler:[ILINK32 Fehler] Error: Nicht auflösbares externes '__stdcall CBaseVideoRenderer::NonDelegatingQueryInterface(_GUID&, void * *)' referenziert von C:\USERS\JULIAN\DESKTOP\PROGRAMM\WIN32\DEBUG\TESTRAUSCHEN.OBJ
...Konstruktoraufruf:
void __fastcall TForm1::btn_kameraClick(TObject *Sender) { HRESULT hr = S_OK; CBitmapRenderer *m_pSnapshotter = new CBitmapRenderer( _T("Bitmap renderer"), NULL, &hr ); }
Klasse:
public: // Constructor and destructor static CUnknown * WINAPI CreateInstance(LPUNKNOWN, HRESULT *); CBitmapRenderer(TCHAR *pName,LPUNKNOWN pUnk,HRESULT *phr); ~CBitmapRenderer(); DECLARE_IUNKNOWN void SetCallback( IBitmapCallback* pcb ) { m_Callback = pcb; } // Override these from the filter and renderer classes. I strongly // suspect we don't need BreakConnect/CompleteConnect either. HRESULT BreakConnect(); HRESULT CompleteConnect(IPin *pReceivePin); HRESULT SetMediaType(const CMediaType *pmt); HRESULT CheckMediaType(const CMediaType *pmtIn); HRESULT DoRenderSample(IMediaSample *pMediaSample); void OnReceiveFirstSample(IMediaSample *pMediaSample); public: CVideoInputPin m_InputPin; // IPin based interfaces CMediaType m_mtIn; // Source connection media type SIZE m_VideoSize; // Size of the current video stream IBitmapCallback* m_Callback; }; // CBitmapRenderer
Ich habe natürlich schon ein bisschen gesucht, Internet wie Forum, und bei einigen schien der Fehler bei Zeilen wie
static CUnknown * WINAPI CreateInstance(LPUNKNOWN, HRESULT *);
gelegen zu haben... bei manchen hat es geholfen, die Funktion umzubenennen (einmal wurde w vorangestellt, einmal _t) und die LP-Datentypen durch LPT zu ersetzen. Allerdings bringen Änderungen hier den selben Fehler:
static CUnknown * WINAPI wCreateInstance(LPTUNKNOWN, HRESULT *);
Ich hatte auch schon gehört, dass ich noch eine Bibliotheksdatei irgendwo einbinden müsste, wüsste aber leider nicht welche...
Könnt ihr mir vielleicht sagen, wo der Fehler liegt oder was für eine Datei das sein könnte?
Ich benutze den C++-Builder 6, denke ich (XE2 16).mit freundlichen Grüßen
Julian
-
Es scheinen einige Bibliotheken gefehlt zu haben... speziell strmbase.lib hat anscheinend gefehlt...
Nur habe ich jetzt ein genauso seltsames Problem.
der Linker sagt mir, ein Konstruktor könnte nicht aufgelöst werden, die definierende Datei ist also nicht eingebunden.
Allerdings habe ich die Datei eingebunden, der Konstruktor dort will allerdings andere Typen... in meinem eigenen Code her rufe ich auch gar nicht die Typen auf, die in der Fehlermeldung stehen...Hier code:
Konstruktor:CBaseVideoRenderer(REFCLSID RenderClass, // CLSID for this renderer TCHAR *pName, // Debug ONLY description LPUNKNOWN pUnk, // Aggregated owner object HRESULT *phr); // General OLE return code
Code:
static const GUID CLSID_BitmapRenderer = { 0x1b32a449, 0x5b89, 0x49bf, { 0xb2, 0x74, 0xf6, 0x9d, 0xbb, 0xad, 0xfc, 0xa8 } }; CBitmapRenderer::CBitmapRenderer( TCHAR *pName, LPUNKNOWN pUnk, HRESULT *phr ) : CBaseVideoRenderer(CLSID_BitmapRenderer,pName,pUnk,phr) , m_InputPin(NAME("Video Pin"),this,&m_InterfaceLock,phr,L"Input") {...
und der Fehler:
[ILINK32 Fehler] Error: Nicht auflösbares externes 'CBaseVideoRenderer::CBaseVideoRenderer(_GUID&, wchar_t *, IUnknown *, long *)' referenziert von C:\USERS\JULIAN\DESKTOP\PROGRAMM\WIN32\DEBUG\TESTRAUSCHEN.OBJ
passe ich die Typen im Konstruktor an, erhalte ich einen Fehler beim compilieren, allerdings genauso seltsam:
[BCC32 Fehler] videologytut.h(109): E2285 Keine Übereinstimmung für 'CBaseVideoRenderer::CBaseVideoRenderer(const _GUID,wchar_t *,IUnknown *,long *)' gefunden
Wisst ihr da weiter?
Was könnte der Fehler wirklich bedeuten?