| Autor |
Nachricht |
chermanns
Mitglied
Benutzerprofil
Anmeldungsdatum: 05.12.2005
Beiträge: 12
|
chermanns Mitglied
09:03:17 30.08.2010 Titel: |
ExitInstance() liefert nicht den gewünschten wert zurück |
Zitieren |
Hallo Leute,
ich habe eine MCF Applikation die ggf. einen Fehler zurückliefern soll.
Dazu habe ich ExitInstance() so überschrieben das der Fehler den ich mir in einer Variablen gemerkt habe zurückgegeben wird.
Soweit die Theorie, auf meinem Entwicklungsrechner funktioniert dies auch.
Ich rufe meine Applikation wiefolgt auf:
start /wait app.exe
nachdem sich die Applikation beendet hat lese ich den returncod mit:
echo %ERRORLEVEL%
aus und der Wert ist richtig, zb. -106 wenn ein Socket nicht geöffnet werden konnte.
Auf anderen Rechner funktioniert dies nicht. Der returncode ist immer 0.
Hier meine ExitInstance():
| Code: | 1 2 3 4 5 6 7 8 9 10 11 | 1 2 3 4 5 6 7 8 9 10 11 | {
..
..
exitCode = getExitCode();
int l_returnInt = CWinApp::ExitInstance();
TRACE(TRACE_LEVEL_INFO, _T( "ExitInstance: (CWinApp::ExitInstance returned %i)" ), l_returnInt );
TRACE(TRACE_LEVEL_INFO, _T( "Return code:%i" ),m_exitCode );
return m_exitCode;
} | |
| Code: | 1 2 3 4 5 6 7 8 9 10 11 | {
..
..
exitCode = getExitCode();
int l_returnInt = CWinApp::ExitInstance();
TRACE(TRACE_LEVEL_INFO, _T( "ExitInstance: (CWinApp::ExitInstance returned %i)" ), l_returnInt );
TRACE(TRACE_LEVEL_INFO, _T( "Return code:%i" ),m_exitCode );
return m_exitCode;
} | |
| Code: | 1 2 3 4 5 6 7 8 9 10 11 | {
..
..
exitCode = getExitCode();
int l_returnInt = CWinApp::ExitInstance();
TRACE(TRACE_LEVEL_INFO, _T( "ExitInstance: (CWinApp::ExitInstance returned %i)" ), l_returnInt );
TRACE(TRACE_LEVEL_INFO, _T( "Return code:%i" ),m_exitCode );
return m_exitCode;
} | |
Das Logfile sieht wiefolgt aus (auf meinem Rechner und auf dem Rechner der 0 zurück gibt)
Step5.cpp - I - ExitInstance: 21 (CWinApp::ExitInstance returned 0)
Step5.cpp - I - Return code:-106
Also, das Log ist in Ordnung aber der returncode nicht!
In meinem Verständnis ist es so wie in dem Beitrag von Martin:
"ExitInstance gibt für dialogbasierende MFC Anwendungen Unfug zurück!"
Hat jemand eine Idee woran es liegen könnte?
Grüsse
Carsten |
Zuletzt bearbeitet von chermanns am 09:44:59 30.08.2010, insgesamt 1-mal bearbeitet |
|
 |
chermanns
Mitglied
Benutzerprofil
Anmeldungsdatum: 05.12.2005
Beiträge: 12
|
chermanns Mitglied
15:07:35 30.08.2010 Titel: |
|
Zitieren |
Hallo Leute,
ich kann das Problem eingrenzen, ich habe zwei Rechner die sich "richtig" verhalten, also den Fehlercode zurückliefern. Auf diesen Rechnern ist VS2005 istalliert.
Auf weiteren zwei Rechnern bekomme ich trotz Fehler immer 0 zurück. Auf diesen Rechnern ist das reditributable Package installiert.
Konnte jemand dieses Verhalten bei sich beobachten (und evtl. beseitigen)?
Grüsse Carsten |
|
|
|
 |
chermanns
Mitglied
Benutzerprofil
Anmeldungsdatum: 05.12.2005
Beiträge: 12
|
chermanns Mitglied
15:56:06 30.08.2010 Titel: |
|
Zitieren |
Wenn ich hart mit aus dem Program austeige mit:
exit (1234);
bekomme ich auf den beiden Rechnern, die kein VS 2005 installiert haben den errorlevel 0 zurück.
Kann mir (mittlerweile verzweifelt) geholfen werden?
Grüsse
Carsten |
|
|
|
 |
Martin Richter
Moderator
Benutzerprofil
Anmeldungsdatum: 18.04.2006
Beiträge: 13137
|
Martin Richter Moderator
09:34:25 31.08.2010 Titel: |
|
Zitieren |
Hmmm. Für exit macht mich das aber sehr stutzig.
Hast Du mal den exit Code gedebuggt? |
_________________ Martin Richter (MVP für C++) WWJD http://blog.m-ri.de
"A well-written program is its own heaven; a poorly written program is its own hell!" The Tao of Programming
|
|
 |
chermanns
Mitglied
Benutzerprofil
Anmeldungsdatum: 05.12.2005
Beiträge: 12
|
chermanns Mitglied
11:56:10 31.08.2010 Titel: |
|
Zitieren |
Hallo,
In der "crtexe.c" kommen die richtigen Werte an (Das meintest Du doch, oder?).
exit(mainret);
enthält meine Werte. Aber auf den Rechnern, auf denen ich debugen kann bekomme ich ja auch den richtigen errorlevel zurück.
Problem sind die Rechner mit den redistributable packages und da kann ich nicht debugen. Aber wenn es damit diesbezüglich Probleme geben sollt hätte ich doch was im Netz gefunden.
Ich benutze die VS 2005 standard edition und auf den "anderen" Rechner das redistributable package 8.0.56336.
Hast du eine Idee?
Grüsse Carsten |
|
|
|
 |
Martin Richter
Moderator
Benutzerprofil
Anmeldungsdatum: 18.04.2006
Beiträge: 13137
|
Martin Richter Moderator
16:56:00 31.08.2010 Titel: |
|
Zitieren |
Exit benutzt direkt die entsprechende Funktion um die Applikation zu beenden.
Mir ist kein Fehler bekannt in dieser Richtung, dass sich hier eine CRT anders verhält... |
_________________ Martin Richter (MVP für C++) WWJD http://blog.m-ri.de
"A well-written program is its own heaven; a poorly written program is its own hell!" The Tao of Programming
|
|
 |
chermanns
Mitglied
Benutzerprofil
Anmeldungsdatum: 05.12.2005
Beiträge: 12
|
chermanns Mitglied
09:44:00 01.09.2010 Titel: |
|
Zitieren |
Habe noch auf zwei Rechnern mit Windows 7 und redistributable packages (ohne Entwicklungsumgebung) getestet. Auf den Rechnern bekomme ich den Rückgabewert den ich erwarte zurück.
Mit dem gleichen redistributable package auf den XP Rechnern installiert (zuvor alle anderen entfernt). Denoch bekomme ich eine 0 statt meinem Fehlercode.
Dazu fällt mit nichts mehr ein.
Hat jemand einen Idee was das sein kann?
Grüsse Carsten |
|
|
|
 |
Martin Richter
Moderator
Benutzerprofil
Anmeldungsdatum: 18.04.2006
Beiträge: 13137
|
Martin Richter Moderator
12:25:35 01.09.2010 Titel: |
|
Zitieren |
Kannst Du Dein Projekt auch statisch Linken? Was passiert dann? |
_________________ Martin Richter (MVP für C++) WWJD http://blog.m-ri.de
"A well-written program is its own heaven; a poorly written program is its own hell!" The Tao of Programming
|
|
 |
chermanns
Mitglied
Benutzerprofil
Anmeldungsdatum: 05.12.2005
Beiträge: 12
|
chermanns Mitglied
14:21:34 01.09.2010 Titel: |
|
Zitieren |
Das geht leider nicht, es ist ziemlich gross und beinhaltet dlls von anderen Leuten und besteht zudem aus recht vielen dlls die alle statisch gelinkt sind.
Ich schaue mir grade ob es einen Unterschied bei dem Beenden der Applikation hinsichtlich Threads gibt. Dazu benutze ich im ersten Schuss:
HANDLE hTaskSnap = CreateToolhelp32Snapshot( TH32CS_SNAPPROCESS, 0 );
um mir die Anzahl der Threads ausgeben zu lassen
int threadCounter = 0;
| Code: | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | int threadCounterID = 0;
{
HANDLE hThreadSnap = CreateToolhelp32Snapshot( TH32CS_SNAPTHREAD, 0 );
THREADENTRY32 te32;
te32.dwSize = sizeof(THREADENTRY32 );
int ret = Thread32First( hThreadSnap, &te32 );
while (ret == TRUE){
if (te32.th32OwnerProcessID == GetCurrentProcessId() ){
threadCounter ++;
}
if (te32.th32ThreadID == 0 ){
threadCounterID++;
}
ret = Thread32Next( hThreadSnap, &te32 );
} DASTRACE(TRACE_LEVEL_INFO, _T( "th32OwnerProcessID:%i" ),threadCounter );
DASTRACE(TRACE_LEVEL_INFO, _T( "th32ThreadID:%i" ),threadCounterID );
}
| |
| Code: | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | int threadCounterID = 0;
{
HANDLE hThreadSnap = CreateToolhelp32Snapshot( TH32CS_SNAPTHREAD, 0 );
THREADENTRY32 te32;
te32.dwSize = sizeof(THREADENTRY32 );
int ret = Thread32First( hThreadSnap, &te32 );
while (ret == TRUE){
if (te32.th32OwnerProcessID == GetCurrentProcessId() ){
threadCounter ++;
}
if (te32.th32ThreadID == 0 ){
threadCounterID++;
}
ret = Thread32Next( hThreadSnap, &te32 );
} DASTRACE(TRACE_LEVEL_INFO, _T( "th32OwnerProcessID:%i" ),threadCounter );
DASTRACE(TRACE_LEVEL_INFO, _T( "th32ThreadID:%i" ),threadCounterID );
}
| |
| Code: | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | int threadCounterID = 0;
{
HANDLE hThreadSnap = CreateToolhelp32Snapshot( TH32CS_SNAPTHREAD, 0 );
THREADENTRY32 te32;
te32.dwSize = sizeof(THREADENTRY32 );
int ret = Thread32First( hThreadSnap, &te32 );
while (ret == TRUE){
if (te32.th32OwnerProcessID == GetCurrentProcessId() ){
threadCounter ++;
}
if (te32.th32ThreadID == 0 ){
threadCounterID++;
}
ret = Thread32Next( hThreadSnap, &te32 );
} DASTRACE(TRACE_LEVEL_INFO, _T( "th32OwnerProcessID:%i" ),threadCounter );
DASTRACE(TRACE_LEVEL_INFO, _T( "th32ThreadID:%i" ),threadCounterID );
}
| |
dabei erhalte ich folgene Ausgabe, die mir nicht klar ist:
Auf den Systemen die sich richtig verhalten:
th32OwnerProcessID:4
th32ThreadID:2
bzw Windows 7:
th32OwnerProcessID:6
th32ThreadID:2
Auf den Systemen die sich falsch verhalten:
th32OwnerProcessID:4
th32ThreadID:1
Beschreibung zu th32ThreadID:
The thread identifier, compatible with the thread identifier returned by the CreateProcess function.
Da stosse ich an meine Grenzen was das bedeutet, hast du einen Tip? |
Zuletzt bearbeitet von chermanns am 15:16:07 01.09.2010, insgesamt 1-mal bearbeitet |
|
 |
chermanns
Mitglied
Benutzerprofil
Anmeldungsdatum: 05.12.2005
Beiträge: 12
|
chermanns Mitglied
15:42:19 02.09.2010 Titel: |
|
Zitieren |
jubel!!
ich habe die Ursache gefunden.
Die Applikation ist etwas grösser. sie besteht aus der *.exe plus ca 20 DLLSs die von mir kommen plus ca 15 DLLs die von verschiedenen Zulieferen kommen.
In einer der zugelieferten DLLs hat sich etwas geändert und das hat meinen Returncode überschrieben.
Ich weiss nicht wie aber ich erhalte mit einer älteren Version der DLL den richtigen Returncode.
Mit der "fehlerhaften" DLL sehe ich, das aus der WinMain mit meinem Fehlercode (5) herauskomme, die Applikation aber mit 0 beendet wird.
Wenn mir das jemand erklären kann wäre ich dankbar!
Ausgabe Debugfenster:
'App.exe': Unloaded 'C:\WINDOWS\system32\comdlg32.dll'
'App.exe': Unloaded 'C:\WINDOWS\system32\winspool.drv'
The thread 'Win32 Thread' (0x8e0) has exited with code 5 (0x5).
The thread 'Win32 Thread' (0x9c8) has exited with code 5 (0x5).
The thread 'Win32 Thread' (0xbc8) has exited with code 5 (0x5).
The program '[2644] App.exe: Native' has exited with code 0 (0x0).
Grüsse Carsten |
|
|
|
 |