In the Headerfile "MyPrivateFunctions.h"
extern CString XTraceStringOnlyInMacro;
#ifdef XTRACE_ENABLE
#define XTRACE10(FORMAT,S1,S2,S3,S4,S5,S6,S7,S8,S9,S10) XTraceStringOnlyInMacro.Format(FORMAT,S1,S2,S3,S4,S5,S6,S7,S8,S9,S10); XTRACE(XTraceStringOnlyInMacro);
#define XTRACE9(FORMAT,S1,S2,S3,S4,S5,S6,S7,S8,S9) XTraceStringOnlyInMacro.Format(FORMAT,S1,S2,S3,S4,S5,S6,S7,S8,S9); XTRACE(XTraceStringOnlyInMacro);
#define XTRACE8(FORMAT,S1,S2,S3,S4,S5,S6,S7,S8) XTraceStringOnlyInMacro.Format(FORMAT,S1,S2,S3,S4,S5,S6,S7,S8); XTRACE(XTraceStringOnlyInMacro);
#define XTRACE7(FORMAT,S1,S2,S3,S4,S5,S6,S7) XTraceStringOnlyInMacro.Format(FORMAT,S1,S2,S3,S4,S5,S6,S7); XTRACE(XTraceStringOnlyInMacro);
#define XTRACE6(FORMAT,S1,S2,S3,S4,S5,S6) XTraceStringOnlyInMacro.Format(FORMAT,S1,S2,S3,S4,S5,S6); XTRACE(XTraceStringOnlyInMacro);
#define XTRACE5(FORMAT,S1,S2,S3,S4,S5) XTraceStringOnlyInMacro.Format(FORMAT,S1,S2,S3,S4,S5); XTRACE(XTraceStringOnlyInMacro);
#define XTRACE4(FORMAT,S1,S2,S3,S4) XTraceStringOnlyInMacro.Format(FORMAT,S1,S2,S3,S4); XTRACE(XTraceStringOnlyInMacro);
#define XTRACE3(FORMAT,S1,S2,S3) XTraceStringOnlyInMacro.Format(FORMAT,S1,S2,S3); XTRACE(XTraceStringOnlyInMacro);
#define XTRACE2(FORMAT,S1,S2) XTraceStringOnlyInMacro.Format(FORMAT,S1,S2); XTRACE(XTraceStringOnlyInMacro);
#define XTRACE1(FORMAT,S1) XTraceStringOnlyInMacro.Format(FORMAT,S1); XTRACE(XTraceStringOnlyInMacro);
#define XTRACE(FORMAT) LogToFile(0, FORMAT, 0, __LINE__ , TRACEFILE)
#else
#define XTRACE10(FORMAT,S1,S2,S3,S4,S5,S6,S7,S8,S9,S10)
#define XTRACE9(FORMAT,S1,S2,S3,S4,S5,S6,S7,S8,S9)
#define XTRACE8(FORMAT,S1,S2,S3,S4,S5,S6,S7,S8)
#define XTRACE7(FORMAT,S1,S2,S3,S4,S5,S6,S7)
#define XTRACE6(FORMAT,S1,S2,S3,S4,S5,S6)
#define XTRACE5(FORMAT,S1,S2,S3,S4,S5)
#define XTRACE4(FORMAT,S1,S2,S3,S4)
#define XTRACE3(FORMAT,S1,S2,S3)
#define XTRACE2(FORMAT,S1,S2)
#define XTRACE1(FORMAT,S1)
#define XTRACE(FORMAT)
#endif
In the CPP File "MyPrivateFunctions.cpp"
void LogToFile(int Level, CString sMessage, int Tracelevel, /*CString Time,*/ int Line, CString File){
if (File.GetLength()>0){
//Es wird nur geschrieben, wenn tatsächlich eine Datei angegeben ist
bool IsNewLine=false;
if (Level<=0){
Level=-Level;
IsNewLine=true;
};
if (Level<=Tracelevel){
CString OutputLine="";
if (IsNewLine){
OutputLine.Format("\n%s",""

;
CString Time;
Time.Format("%10.1f",(float)(GetTickCount()-StartTickCount)/1000.);
if (Time==LastTimeStamp){
for (int i=0;i<LastTimeStamp.GetLength();i++) OutputLine+=" ";
}else{
OutputLine+=Time;
LastTimeStamp=Time;
};
CString sLineNumber;sLineNumber.Format(" %5i:",Line);
OutputLine+=sLineNumber;
};
OutputLine+=sMessage;
ofstream f;
f.open(File,ios:

ut | ios::app);
f << OutputLine;
f.close();
};
};
}
CString XTraceStringOnlyInMacro;
In any other files of your project
#define TRACEFILE ""
XTRACE ("-----"

;
nothing happens
#define TRACEFILE "MyTraceFile.txt"
XTRACE ("-----"

;
writes to MyTraceFile.txt
Believe me, it is much easier to use than to write filename into the Parameter list.
Besides: I put the line number to the file (could do it with filename too), the most simple way to get the correct line number to the file is to use a macro, 'cause this is substituted by compiler...
Try It out, if you want, it helped me a lot.
The only problem I still have is like I said: how to switch between #define's. Thx
Greetings Andreas