Toon posts:

CComptr: missing storage-clas or type specifiers

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik ben een NOOB in het gebruik van COM en wil daarom eerst een paar kleine dingetjes uitproberen in Visual C++ 6.0. Heb wat voorbeeld code bestudeerd en documentatie die bij die voorbeelden hoort. Verder heb ik informatie over COM bestudeert maar daar staat veelal in hoe je zelf COM objecten implementeert. Daar ben ik, voor nu, even niet in geinteresseerd. Bij een hele simpele klasse krijg ik hele elementaire fouten die alles te maken hebben met dat ik nog maar een beginner ben. Kan iemand mij een duwtje in de rug geven? De klasse ziet er zo uit:

header file:

#include <atlbase.h>

class COMTest{

private:
CComptr<IRouteLister> pRouteLister;
void CreateRouteLister();

public:
COMTest();
~COMTest();

};

cpp file:

#include "COMTest.h"

void COMTest::CreateRouteLister(){
pRouteLister.CoCreateInstance(CLSID_RouteLister);

CComQIPtr<ILayerModel> pLayerModel = pRouteLister;
pLayerModel->put_Path(L"c:/maps/eu7.map/eur_city.d50"); // Set Path to Routing-Net (*.d50)


}

De constructor en destructor heb ik nog niet geïmplementeerd omdat ik bij het statement CComptr<IRouteLister> pRouteLister; verschillende foutmeldingen krijg:

error C2143: syntax error : missing ';' before '<'
error C2501: 'CComptr' : missing storage-class or type specifiers
syntax error : '<'
error C2065: 'pRouteLister' : undeclared identifier

Vooral om de tweede errot (missing storage-class or type specifiers) gaat het mij: wat wordt daarmee bedoeld?

Ik weet dat ik mezelf gruwelijk voor lul zet met deze vraag maar ik kom er echt gewoon niet uit!

Bedankt.

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 22-08 01:56
Volgens mij krijg ik die "missing storage-class or type specifiers" melding altijd als het type niet gedefinieerd is (de compiler denkt dan dat het om een functie/variabele zonder type gaat). Is CComptr dus wel gedefinieerd?

Verwijderd

't is CComPtr niet CComptr

  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 21-08 17:14
Het gaat daarna waarschijnlijk weer fout omdat IRouteLister ook niet bekend is.

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


Verwijderd

Topicstarter
Nou MSalters, dat is dus raar dat het daarna weer fout zou gaan. Die IRouteLister is een interface van één van de COM objecten die wel wordt gezien tijdens de code completion. Ik krijg inderdaad ook de error "undeclared identifier" voor IRouteLister maar de packages waar die in zou moeten zitten heb ik wel geimporteerd... Waarschijnlijk ligt de fout toch bij die CComPtr. Ik krijg namelijk nog een andere error en dat is:

error C2955: 'CComPtr' : use of class template requires template argument list
c:\program files\microsoft visual studio\vc98\atl\include\atlbase.h(563) : see declaration of 'CComPtr'

Hoe duidelijk die error voor jullie ook moge zijn, ik snap er niet veel van. Ik bedoel, die template argument list is dan toch IRouteLister, de interface naar een COM object? Of ben ik nou gek?

Verwijderd

heb je no_namespace opgegeven bij je import?

  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 21-08 17:14
Verwijderd schreef op 15 February 2003 @ 18:34:
Nou MSalters, dat is dus raar dat het daarna weer fout zou gaan. Die IRouteLister is een interface van één van de COM objecten die wel wordt gezien tijdens de code completion. Ik krijg inderdaad ook de error "undeclared identifier" voor IRouteLister maar de packages waar die in zou moeten zitten heb ik wel geimporteerd... Waarschijnlijk ligt de fout toch bij die CComPtr. Ik krijg namelijk nog een andere error en dat is:

error C2955: 'CComPtr' : use of class template requires template argument list
c:\program files\microsoft visual studio\vc98\atl\include\atlbase.h(563) : see declaration of 'CComPtr'

Hoe duidelijk die error voor jullie ook moge zijn, ik snap er niet veel van. Ik bedoel, die template argument list is dan toch IRouteLister, de interface naar een COM object? Of ben ik nou gek?
Code completion is verre van perfect. Die geeft eerder teveel dan te weinig opties. Als je ergens in een file IRouteLister kent, dan suggereert MSVC 'm ongeveer overal.

De error is dus overduidelijk, als je dat weet. CComPtr< > moet een (compleet) type als argument hebben. Omdat IRouteLister onbekend is, weet de compiler dus niet dat het een type is ('t zou ook een variabele kunnen zijn) en dus ook niet of IRouteLister geschikt is om het template mee te instantieren.

Precies wat ik voorspelde dus.

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


Verwijderd

Topicstarter
Oké, bedankt. Ik ben overigens meer thuis in Delphi en daar lijkt het allemaal wel te lukken. Ik moet het echter in C++ doen... Wat jij, MSalters, zegt is heel duidelijk. Echter, de interface is, zoals ik vertelde geimporteerd in een apparte header en cpp file. Als ik in de gegenereerde tlh en tli bestanden kijk zie ik IRouteLister er netjes tussen staan. In RTG4.tlh:

....
/* interface */ IRouteLister;
struct __declspec(uuid("da81b8c0-1706-477f-8b2c-d54b649d4362"))
...

En ook in de implementatie (RTG4.tli) komt ie netjes terug (zijn erg veel regels dus maar niet gepaste).

Moet ik misschien nog ergens een include doen ofzo? Ik ben echt ten einde raad!

  • martijn_brinkers
  • Registratie: November 2001
  • Laatst online: 31-10-2025
waarschijnlijk impliceert een #import niet een #include. Waarom probeer je niet die gegenereerde header file te includen?

Verwijderd

Verwijderd schreef op 15 February 2003 @ 19:07:
heb je no_namespace opgegeven bij je import?
*Kuch*

Verwijderd

Topicstarter
Ja meneer kuch, dat heb ik geprobeerd. En nee, een #include impliceert niet een #import. Het #includen van de header files van de typelibraries wil niet werken. Ik krijg dan nog steeds de undeclared identifier (IRouteLister). Raar eigenlijk want nu heb ik het toch wel erg dik voorgekouwd. Ben nu trouwens in Delphi bezig en daar lijkt het vooralsnog wel te werken. (het importeren en het verkrijgen van de benodigde COM objecten). Of ik er vervolgens ook wat mee kan is dan het volgende punt. ;-).

Verwijderd

Weet je wat zoek het fijn zelf uit dan.

Verwijderd

Topicstarter
Ja sorry maar ik zit niet te wachten op uitspraken als "zoek het fijn zelf uit". Snap even niet waar dat voor bedoeld was?

  • martijn_brinkers
  • Registratie: November 2001
  • Laatst online: 31-10-2025
nou Yarvieh heeft 2 keer gevraagd of je bij het importeren "no-namespace" hebt opgegeven waarop jij nog niet hebt geantwoord. Dus ik herhaal Yarvieh's vraag: "heb je no-namespace opgegeven bij je import" :)

Verwijderd

Topicstarter
Nou die vraag heb ik wel beanwoord TijFLip maar misschien kon ie niet zo goed tegen "meneer kuch". Maar dat was natuurlijk niet als kwetsend bedoeld. Mijn excuses Yarvieh. Maar nogmaals: ik heb die no_namespace al geprobleerd.

  • martijn_brinkers
  • Registratie: November 2001
  • Laatst online: 31-10-2025
hoe ziet IRouteLister eruit in de header file die je hebt geinclude?

Verwijderd

Het probleem waar je tegen aan loopt is dat #import by default je interfaces niet in de default namespace zet maar in een namespace met de naam van je library die je import vandaar dat ik vroeg of je no_namespace had opgegeven. Als jij daar dan niet op reageerd en vervolgens wanhopig om antwoorden gaat vragen krijg je inderdaad 'n subtiele *kuch* van mij. Dat je 't geprobeerd hebt kan best maar dat kunnen wij hier natuurlijk ook niet ruiken he? we zijn niet allemaal in bezit van een glazen bol, we kunnen en willen je best helpen hier maar dan moet JIJ wel een fatsoenlijke situatie schets kunnen maken en aan kunnen geven wat je wel/niet geprobeerd/gedaan hebt.

Verwijderd

Topicstarter
Er zijn zeg maar twee type library bestanden waar de IRouteLister wordt "genoemd". In het ene bestand (Rtg4.tlh) zit dit er zo uit:

/* interface */ IRouteLister;
struct __declspec(uuid("da81b8c0-1706-477f-8b2c-d54b649d4362"))

Dat lijkt mij een declaratie naar een interface met een bepaalde interface id. De no_namespace, die ik nu gebruik, verhelpt de error niet maar in de voorbeelden wordt bijvoorbeeld weleens namespace ROUTINGLib of iets dergelijks gebruikt. De vraag is eigenlijk wat die namespace dan te maken heeft met het feit dat IRouteLister een undeclared identifier is? Dit impliceert dat ik die type libraries nergens heb geimporteerd. Met Delphi ben ik nu bezig met die libraries en daar lukt het, gek genoeg, wel. Ik gebruik daar weliswaar een afstammeling van IRouteLister, genaamd IRouteLister5, maar als ik IRouteLister5 in Visual C++ gebruik, is het wederom een undeclared identifier. Waarom niet gewoon in Delphi afmaken vragen jullie je misschien af? Nou gewoon omdat ik graag zou willen weten wat ik fout doe.

[ Voor 9% gewijzigd door Verwijderd op 16-02-2003 20:24 ]


  • martijn_brinkers
  • Registratie: November 2001
  • Laatst online: 31-10-2025
struct __declspec(uuid("da81b8c0-1706-477f-8b2c-d54b649d4362"))

is geen declaratie van een interface. Het is een guid (globally unique identifier) voor de IRouteLister interface. De interface zelf staat ergens in een gegenereerde header file. Als je nou eens laat zien hoe die interface eruit ziet? hij moet toch ergens in een header file staat die je include.

Verwijderd

De vraag is eigenlijk wat die namespace dan te maken heeft met het feit dat IRouteLister een undeclared identifier is?
Simpel als ie gedinieerd is in een andere namespace dan de default zal je de namespace expliciet aan moeten geven bij je declaratie anders kan ie 'm niet vinden..

Kan je niet gewoon 'n zipje met je code online zetten? dan kijken we ff mee en is het in 'n uurtje opgelost gok ik ;)

Verwijderd

Topicstarter
Ja dat zou heel mooi zijn Yarvieh! Nou ik ben op dit moment in ieder geval al wel een beetje verder gekomen. Ik gebruik nu niet meer de declaratie naar IRouteLister maar laat een FactoryClass de pointer retourneren. Ook al mag het niet volgens GoT: ik dank jullie toch hartelijk. Als ik nog problemen heb, zal ik zeker nog eens terugkomen.
Pagina: 1