Portierung VC6->VS2008 C2440: .. kann nicht in 'AFX_PMSG' konvertiert werden
-
tagchen leute!
feiere heute meinen einstand und winke deshalb mal in die runde *wink!
zu meiner frage:
ich möchte ein projekt portieren von VC6 nach VS2008
viele "deprecated" habe ich behoben, und jetzt hänge ich bei diesem fehler:error C2440: 'static_cast': 'int (__thiscall CDoorManagerDlg::* )(void)' kann nicht in 'AFX_PMSG' konvertiert werdenist der schon bekannt? wieso krieg ich einen fehler, wenn bei VC6 noch korrekt war? habe gelesen dass der Kompiler "strenger" wurde, z.b bzgl "default int".
bei allen funktionen die im einen int zurückgeben (OnDateiEinstellungenladen), tritt dieser fehler auf. bei den voids (OnDateiEinstellungenspeichern) ists ok.
hier der ganze zusammenhang:
//-----.h----- afx_msg int OnDateiEinstellungenladen(); afx_msg void OnDateiEinstellungenspeichern(); BEGIN_MESSAGE_MAP(CDoorManagerDlg, CDialog) //{{AFX_MSG_MAP(CDoorManagerDlg) .. ON_COMMAND(ID_DATEI_EINSTELLUNGENLADEN, OnDateiEinstellungenladen) ON_COMMAND(ID_DATEI_EINSTELLUNGENSPEICHERN, OnDateiEinstellungenspeichern) .. //}}AFX_MSG_MAP END_MESSAGE_MAP() //-----afxmsg_.h----- #define ON_COMMAND(id, memberFxn) \ { WM_COMMAND, CN_COMMAND, (WORD)id, (WORD)id, AfxSigCmd_v, \ static_cast<AFX_PMSG> (memberFxn) },kann mir jmd helfen?

gruss und schönes wochenende!
-
Dis Signatur stimmt nicht. Der Rückgabewert für wiwn WM_COMMAND Handler muss void sein!
-
danke erstmal für deine antwort!
ok ich verstehe das problem.
so wie ich das nachvollzogen habe, waren ursprünglich alle fcn mit void rückgabe.
dann wurden fehler codes (int return) eingebaut, jetzt passts nimmer mit dem Handler.ok, wenn ich die fehlercode returns weiterhin will, brauch ich die ..
AfxSig_wv = AfxSig_u_v_v, // UINT (void)Signatur.
das bedeutet dass ich die afxmsg_.h erweitern muss? ist das geschickt?
#define ON_COMMAND(id, memberFxn) \ { WM_COMMAND, CN_COMMAND, (WORD)id, (WORD)id, AfxSigCmd_v, \ static_cast<AFX_PMSG> (memberFxn) },UND
#define ON_COMMAND_UINT_RETURN(id, memberFxn) \ { WM_COMMAND, CN_COMMAND, (WORD)id, (WORD)id, AfxSig_u_v_v, \ (AFX_PMSG) \ (static_cast< int (AFX_MSG_CALL CCmdTarget::*)(void)> \ (memberFxn)) },kompilerfehler ist weg!

was mir jetzt nicht so gefallen hat, ist die tatsache dass ich da in der afxmsg_.h verändert hab (ist ja eine VS2008 datei (programmverzeichnis). trotzdem ok? oder würdest du den #define in einer projektdatei machen?
bitte um kommentar

grüsse
-
hi leute
das war nix.
das problem hat mich wieder eingeholt, denn zur laufzeit stützts mein programm jämmerlich ab bei diesen menu fxn mit rückgabewert (debug assertion error).
mit signatur AfxSig_u_v_v (enum 49) flieg ich in
cmdtarg.cpp ..AFX_STATIC BOOL AFXAPI _AfxDispatchCmdMsg(CCmdTarget* pTarget, UINT nID, int nCode, AFX_PMSG pfn, void* pExtra, UINT_PTR nSig, AFX_CMDHANDLERINFO* pHandlerInfo) // return TRUE to stop routing { ENSURE_VALID(pTarget); UNUSED(nCode); // unused in release builds union MessageMapFunctions mmf; mmf.pfn = pfn; BOOL bResult = TRUE; // default is ok if (pHandlerInfo != NULL) { // just fill in the information, don't do it pHandlerInfo->pTarget = pTarget; pHandlerInfo->pmf = mmf.pfn; return TRUE; } switch (nSig) { default: // illegal ASSERT(FALSE); return 0; break;.. in hohem bogen raus (meine Signatur = default = illegal)

wie geht die richtige lösung nun? oder wie bringe ich:
afx_msg int OnDateiEinstellungenladen(); ON_COMMAND .. AfxSig_BlaBlazusammen?
zum thema hab ich noch das gefunden:
"MFC:
Einige MessageMap-Einträge enthielten Handler, die void oder UINT waren. VC 7 hätte da gerne LRESULT als Rückgabewert. Die Position einiger interner MFC-Header hat sich verändert."
(Quelle: http://forum.fachinformatiker.de/c-compiler-ides-apis/33879-compilerumstellung-visual-studio-6-visual-studio-7-net.html)was hiesse das für mich? int = LRESULT?
gruss
-
Verstehst Du cniht, dass ein ON_COMMAND Haqndler nur eine void Fktion sein darf.
Deine Funktion hat die falsche Signatur!
Was ist denn daran so schwer?
-
hi
natürlich seh ich dass es nicht zusammenpasst.
die frage ist jetzt mehr hat der VC6 kompiler das einfach noch gefressen und VC7+ nicht mehr, und vorallem WAS passe ich nun an? die signatur, die funktion, die sourcen?ich habe ja schon die signatur geändert auf: AfxSig_u_v_v
damit komm ich jetzt aber nicht mehr weiter (siehe fehlerbeschrieb oben).gemäss deiner aussage muss ich die int return funktionen nun void machen,
da es mit neuem kompiler und sourcen tatsächlich nicht mehr möglich ist int return fxn zu machen.
gruss
-
1. Der VC6 hat es gefressen. Seit VC2003 sind die Messagemaps absolut typensicher.
2. Du pasdst gefälligst Deine Funktion an und nicht die MFC bzw. die Message-Map!
3. Wenn Du auch eine Funktion benötigst, die etwas zurück gibt, dann bau Dir eine und ruf die aus dem Handler auf.
Der Handler hat kein Interesse an einem Rückgabewert. Oder Du verwendest ON_COMMAND_EX.Was soll denn auch ein return fxn? Was wilst Du den wem damit sagen?
afx_msg void OnDateiEinstellungenladenHandler(); bool DateiEinstellungenladen(); void CMyClass::OnDateiEinstellungenladenHandler() { DateiEinstellungenladen(); }
-
ok! danke für die deutliche antwort.
ich wollt einfach sicher sein, bevor ich alles umstelle ( weg von return values, hin zu einer zusätzlichen fcn.
was hältst du von davon das ganze mit try catch zu lösen?g
-
Mir ist nicht klar von welchem Fall Du redest?
Wer soll wann und wo Deinen throw fangen?
-
ich habe da eine vermutung, wie das ganze zu stande gekommen ist:
zb die funktion
OnOptionenWerkseinstellungen()diese konnte in Menü ausgewählt werden und kein schwein hat den rückgabe wert ausgewertet. es gab nur AfxMessageBox mit Fehler und fertig.
ZUSAETZLICH wird die fcn aber noch aus anderem kontext auf gerufen. dort wurde dann return val ausgewertet.auf deutsch. der eventhandler wurde frech aufgerufen obwohl das eigentliche ereignis nicht aufgetreten ist. da wär dann dein vorschlag mit neuer fcn sicher besser.
naja, ich darfs nun ausbaden.
g