[c++/cli] Match probleem met callback 'delegate type'

Pagina: 1
Acties:

  • mrFoce
  • Registratie: Augustus 2004
  • Laatst online: 22-02 18:18
Ik ben nu al 2 dagen bezig met het porten van een TCP server van C# naar C++. (gevonden op planet-source-code) Dit alles in VS2005 .Net.

Na veel 'compiler' errors opgelost te hebben, zit ik nu met een error die ik niet opgelost krijg.

De erorr:
code:
1
1>.\serverHandler.cpp(58) : error C3352: 'void tcpServer::serverHandler::onBeginAccept(System::IAsyncResult ^)' : the specified function does not match the delegate type 'void (System::IAsyncResult ^)'
serverHandler.h
code:
1
2
3
...........
void onBeginAccept(IAsyncResult^ ar); //Functie die wordt aangeroepen door callback
.........

serverHandler.cpp

de aanroep die de compiler error veroorzaakt
code:
1
listener->BeginAccept( gcnew AsyncCallback( &serverHandler::onBeginAccept), listener);  //listener is een socket
de functie onBeginAccept
code:
1
2
3
4
void serverHandler::onBeginAccept( IAsyncResult^ ar )
{
.......
}


Zelf gezocht:
Google natuurlijk, MSDN ( http://msdn.microsoft.com...ynccallbackclasstopic.asp enz ) maar allemaal geen succes

Op MSDN wordt de volgende code ook aangevoerd: ( http://msdn2.microsoft.co...rary/5bb431f9(VS.80).aspx )
code:
1
s->BeginAccept( gcnew AsyncCallback( &Async_Send_Receive::Connect_Callback ), s );
Zo te zien is mijn aanroep toch echt gelijk. |:(

Vraag:
Hoe los ik dit op? Wat doe ik fout (en waarom :+ ). Pfff ziet er uit als een zooitje dit topic, maar hoop dat iemand me het juiste zetje kan geven. Want ben er nu al veeel te lang mee bezig het op te lossen ( x aantal uur)

Bij serverHandler.h -> delegate void AsyncCallback( IAsyncResult^ ar ); <- erbij zetten had ook niet het gewenste effect..

[ Voor 19% gewijzigd door mrFoce op 12-04-2006 14:49 . Reden: update ]


  • H!GHGuY
  • Registratie: December 2002
  • Niet online

H!GHGuY

Try and take over the world...

volgens mij staat er een komma fout

ASSUME makes an ASS out of U and ME


  • mrFoce
  • Registratie: Augustus 2004
  • Laatst online: 22-02 18:18
HIGHGuY schreef op woensdag 12 april 2006 @ 09:10:
volgens mij staat er een komma fout
Volgens mij niet. Maar als jij kan aangeven, welke komma er volgens jou fout is O-) Heb er nu al zolang naar zitten kijken dat ik er waarschijnlijk overheen kijk.. Het is trouwens wel zo dat ik VS2005 gebruik wat weer een ietwat andere syntax heeft dan voorgaande versies..

Maar de aanroep is identiek aan het voorbeeld op msdn.. Helaas geeft msdn niet aan hoe de 'functie' eruit ziet die zij aanroepen ( &Async_Send_Receive::Connect_Callback ), maar neem aan dat dit ook Class::Functie is ..

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 16:11

.oisyn

Moderator Devschuur®

Demotivational Speaker

gideon82 schreef op woensdag 12 april 2006 @ 11:20:
[...]


Volgens mij niet. Maar als jij kan aangeven, welke komma er volgens jou fout is O-)
Wat dacht je van de enige komma op de regel die de foutmelding veroorzaakt :Y). BeginAccept verwacht 1 parameter, jij geeft er nu 2. Als ik in de MSDN naar BeginAccept zoek vind ik trouwens alleen een Socket::BeginAccept die 2 parameters verwacht, een AsyncCallback^ en een Object^. Maar deze functie heb je zelf gespecificeerd, of niet? Je zult daar dus wel iets fout doen.
Het is trouwens wel zo dat ik VS2005 gebruik wat weer een ietwat andere syntax heeft dan voorgaande versies..
Dat heet C++/CLI, het nieuwe C++.Net zeg maar. Het is een geheel eigen standaard taal, en dus geen C++ :). Vandaar dat ik ook de topictitel ietwat heb aangepast.

[ Voor 17% gewijzigd door .oisyn op 12-04-2006 12:02 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • mrFoce
  • Registratie: Augustus 2004
  • Laatst online: 22-02 18:18
.oisyn schreef op woensdag 12 april 2006 @ 11:54:
[...]

Wat dacht je van de enige komma op de regel die de foutmelding veroorzaakt :Y). BeginAccept verwacht 1 parameter, jij geeft er nu 2. Als ik in de MSDN naar BeginAccept zoek vind ik trouwens alleen een Socket::BeginAccept die 2 parameters verwacht, een AsyncCallback^ en een Object^. Maar deze functie heb je zelf gespecificeerd, of niet? Je zult daar dus wel iets fout doen.


[...]

Dat heet C++/CLI, het nieuwe C++.Net zeg maar. Het is een geheel eigen standaard taal, en dus geen C++ :). Vandaar dat ik ook de topictitel ietwat heb aangepast.
De functie die ik aanroep, verwacht een callback & object inderdaad. Maar die geef ik zover ik weet ook mee (ben geen c++ / cli pro ).

callback -> gcnew AsyncCallback( &serverHandler::BeginAccept)
object -> listener

Ik heb alle code gepost, hoop toch dat iemand me kan helpen ermee O-)

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 16:11

.oisyn

Moderator Devschuur®

Demotivational Speaker

gideon82 schreef op woensdag 12 april 2006 @ 14:17:
[...]

De functie die ik aanroep, verwacht een callback & object inderdaad.
Nee, de functie die je aanroept verwacht alleen een callback, geen object
C++:
1
void BeginAccept(IAsyncResult^ ar); //Functie die wordt aangeroepen door callback


Ik zie daar toch echt alleen maar een IAsyncResult^ (die je aanmaakt door een AsyncCallback te instantieren), geen Object^ (de listener die je meegeeft)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • mrFoce
  • Registratie: Augustus 2004
  • Laatst online: 22-02 18:18
.oisyn schreef op woensdag 12 april 2006 @ 14:34:
[...]

Nee, de functie die je aanroept verwacht alleen een callback, geen object
C++:
1
void BeginAccept(IAsyncResult^ ar); //Functie die wordt aangeroepen door callback


Ik zie daar toch echt alleen maar een IAsyncResult^ (die je aanmaakt door een AsyncCallback te instantieren), geen Object^ (de listener die je meegeeft)
Uhm, snap dat het onduidelijk is..

Maar de functie BeginAccept heb ik hernoemd naar onBeginAccept, om verwarring te verkomen

listener->BeginAccept is een method van de Socket class
(start post ook ff upgedate. Probleem blijft hetzelfde)..

Vreemd genoeg werkt de code wel in C#.. Ik dacht dat C# en C++ in syntax nauwelijks verschillen in Visual Studio (vandaar dat ik dacht dat het wel te porten was.. Grotendeels zonder al teveel prolemen gelukt).

[ Voor 21% gewijzigd door mrFoce op 12-04-2006 14:44 ]


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 16:11

.oisyn

Moderator Devschuur®

Demotivational Speaker

Aah ok, nu snap ik het idd. Sorry voor de verwarring.

is je serverHandler wel een ref class? En je kunt iig niet zondermeer aannemen dat de C# syntax met C++ overeenkomt :)

[ Voor 3% gewijzigd door .oisyn op 12-04-2006 14:53 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Verwijderd

Waarom wil je trouwens iets van C# naar managed C++ porteren?

  • mrFoce
  • Registratie: Augustus 2004
  • Laatst online: 22-02 18:18
.oisyn schreef op woensdag 12 april 2006 @ 14:53:
Aah ok, nu snap ik het idd. Sorry voor de verwarring.

is je serverHandler wel een ref class? En je kunt iig niet zondermeer aannemen dat de C# syntax met C++ overeenkomt :)
Ja, -> public ref class serverHandler

En de reden voor het porten is dat toen ik zelf aan de gang ging, het niet goed werkend kreeg met meerdere 'clients'. Verschillende voorbeelden gezien en uiteindelijk deze gevonden. Reden voor de port is dat ik al 'tijden' bezig ben om c++/cli te leren, en het beste leer aan de hand van voorbeelden.
(vind t zelf erg vervelend dat ik de klepel heb horen luiden enz. Maar dit C# voorbeeld dat ik gekozen heb heeft een aantal functionaliteiten die ik wil begrijpen. Zoals delegate events enz )

[ Voor 26% gewijzigd door mrFoce op 12-04-2006 15:07 ]


Verwijderd

gideon82 schreef op woensdag 12 april 2006 @ 15:02:
[...]

Reden voor de port is dat ik al 'tijden' bezig ben om c++/cli te leren, en het beste leer aan de hand van voorbeelden.
(vind t zelf erg vervelend dat ik de klepel heb horen luiden enz. Maar dit C# voorbeeld dat ik gekozen heb heeft een aantal functionaliteiten die ik wil begrijpen. Zoals delegate events enz )
Dat is inderdaad een goede reden.
Ik heb ooit redelijk veel in C++ geprogrammeerd, maar de laatste 10 jaar alleen maar incidenteel.

  • mrFoce
  • Registratie: Augustus 2004
  • Laatst online: 22-02 18:18
Oplossing: De aan te roepen functie 'static' maken .. 8)7
Pagina: 1