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.aspKeine 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!