Kann man eigene RFX Funktionen schreiben?



  • Ich möchte gerne eine Klasse für IDs machen. So könnte ich eine Umstellung besser machen.

    Diese Klasse muss aber eine eigene RFX-Funktion haben, weil sie in der Einbauphase auf Zahlen zugreifen muss und später soll das mal auf Strings geändert werden.

    Wie geht das? 🙂



  • Auf die Gefahr, dich hier mit nutzlosen Links zuzumüllen:

    http://www.redpt.com/SnmpQL/RFX_ULong.html
    http://msdn.microsoft.com/library/deu/default.asp?url=/library/DEU/vccore/html/_core_record_field_exchange_.28.rfx.29.asp

    Keine Ahnung, ob das hilfreich ist, hab eigentlich keine Ahnung, was RFX ist 😉



  • Der erste Link sieht vielversprechend aus. 🙂

    Der zweite erklärt zwar "nur", was das ist - scheint aber andere interessante Links zu enthalten. Ich werde mal lesen und ausprobieren. 🙂



  • Sooo, das Beispiel passt freundlicherweise wie "Faust auf Auge" in meine Bedürfnisse.

    Leider kompiliert es nicht. 😞

    void AFXAPI RFX_ID(CFieldExchange* pFX, LPCTSTR szName, unsigned long& value)
    {
    	switch (pFX->m_nOperation)
    	{
    	case CFieldExchange::Fixup:
    	case CFieldExchange::SetFieldNull:
    	case CFieldExchange::MarkForAddNew:
    	case CFieldExchange::AllocCache:
    		RFX_Long(pFX, szName, reinterpret_cast<unsigned long>(value)); // <--- Da meckert er.
    		return;
    	}
    
    	UINT nField;
    	if (!pFX->IsFieldType(&nField))
    		return;
    
    	switch (pFX->m_nOperation)
    	{
    #ifdef _DEBUG
    	case CFieldExchange::DumpField:
    		*pFX->m_pdcDump << "\n" << szName << " = " << value;
    		return;
    #endif
    	case CFieldExchange::MarkForUpdate:
    		{
    			if (value != AFX_RFX_LONG_PSEUDO_NULL)
    				pFX->m_prs->ClearNullFieldStatus(nField - 1);
    			// fall through
    		}
    	default:
    		{
    			LONG* plLength = pFX->m_prs->GetFieldLengthBuffer(
    				nField - 1, pFX->m_nFieldType);
    			pFX->Default(szName, &value, plLength, SQL_C_ULONG,
    				sizeof(value), 10);
    			return;
    		}
    	}
    }
    
    error C2440: 'reinterpret_cast' : 'unsigned long' kann nicht in 'unsigned long' konvertiert werden
            Diese Konvertierung ist eine gueltige Standardkonvertierung, die implizit oder mit dem static_cast-Operator oder mit einer Typumwandlung im C- oder Funktionsformat durchgefuehrt wird
    

    Die Zeile ist im Beispiel etwas anders, dann bekomme ich folgende Meldung:

    error C2059: Syntaxfehler : '('
    

    Wie muss ich das nun schreiben? 😕



  • Dann nimm doch den reinterpret_cast raus. An der Stelle macht er eh keinen Sinn.



  • Kann ich einen long einfach so in einen unsigned long stecken? 😕

    Was passiert denn, wenn der Wert größer ist, als das, was in einen long reinpasst? 😮

    Außerdem gibt auch das eine Fehlermeldung:

    RFX_Long(pFX, szName, value);
    
    error C2664: 'RFX_Long' : Konvertierung des Parameters 3 von 'unsigned long' in 'long &' nicht moeglich
            Ein Verweis, der nicht auf ein 'const' zeigt, kann nicht an einen Wert gebunden werden, bei dem es sich nicht um einen L-Wert handelt
    


  • static_cast<long&>(value) vielleicht? Ich kenne die RFX-Sachen nicht, deswegen kann ich nur raten.



  • Wie ist RFX_Long denn definiert?

    Ich hätte es jetzt so gemacht, unter der Annahme, dass RFX_Long einen long& erwartet:

    RFX_Long(pFX, szName, (long&)(long)(value));
    

    Möglicherweise braucht man den (long&)-Cast garnicht.

    Ist nicht schön, ich weiss 😉



  • Glaubst du, ich hab davon Ahnung? 😃 Mehr als die Links da oben kenne ich auch nicht. 😞

    Wenn ich es so mache, wie du vorgeschlagen hast, meldet er:

    error C2440: 'static_cast' : 'unsigned long' kann nicht in 'long &' konvertiert werden
            static_cast-Operator auf Verweis kann nur für gueltige Initialisierungen oder für L-Wert-Konvertierungen zwischen verwandten Klassen verwendet werden
    

    War wohl auch nix.
    Mit einem C-Cast würde es ja gehen, aber da "funktioniert" es ja immer. 🙄



  • Um auf der sicheren Seite zu sein, könntest du den unsigned long auch erst in eine temporäre Variable vom Typ long kopieren. Dann sollte es ohne Probleme gehen.



  • @dEUs: Daran hab ich auch schon gedacht, aber ich habe Angst, dass ich mir damit wieder eine Zeitbombe einbaue. 😞



  • Eigentlich müsste es klappen wenn du die Konvertierung implizit lässt. Glaube nicht, dass man da Probleme hat mit Wertebereichen, sonst würden sie ja auch ein RFX_ULong anbieten.



  • Wieso Zeitbombe?

    Da du das wohl nciht so genau weisst:

    unsigned char uc=255;
    signed char sc=(signed char)uc;
    cout << sc;
    

    Ausgabe müsste -1 sein.

    Analog ist es beim long.



  • Puuuuh... doch... es dämmert... da war mal was. 🙄
    Stimmt, wenn das "dumm" gecastet wird, dann sollte das problemlos funktionieren. 😃

    Danke! 🙂

    Tja, ICH hab die Erklärung verstanden, aber mein Compiler wohl nicht... 😡

    RFX_Long(pFX, szName,  (long)(value));
    
    error C2664: 'RFX_Long' : Konvertierung des Parameters 3 von 'long' in 'long &' nicht moeglich
            Ein Verweis, der nicht auf ein 'const' zeigt, kann nicht an einen Wert gebunden werden, bei dem es sich nicht um einen L-Wert handelt
    
    RFX_Long(pFX, szName,  (long&)(long)(value));
    
    error C2102: '&' erwartet L-Wert
    
    RFX_Long(pFX, szName, value);
    
    error C2664: 'RFX_Long' : Konvertierung des Parameters 3 von 'unsigned long' in 'long &' nicht moeglich
            Ein Verweis, der nicht auf ein 'const' zeigt, kann nicht an einen Wert gebunden werden, bei dem es sich nicht um einen L-Wert handelt
    


  • try this:

    long tmp = (long)value;
    RFX_Long(...,...,tmp);
    


  • Ahhh, es compiliert. 🙂

    Ich habe es aber sicherheitshalber noch zurückgeschrieben (value ist sicherlich nicht ohne Grund eine Übergabe als Referenz):

    long tmp = (long)value;
    		RFX_Long(pFX, szName, tmp);
    		value = (unsigned long)tmp;
    

    Danke! 👍


Anmelden zum Antworten