Knowledge Base Nr: 00106 AppSwitch.cpp - http://www.swe-kaiser.de

Win32: Auf anderes Programm umschalten und warten bis dieses eine Datei erzeugt hat. Danach wieder zurückschalten

  
//(wildcards werden unterstützt!)
//alte messwertdatei(en) löschen
//auf messprogramm umschalten
//warten bis neue messwertdatei erzeugt (timeout!)
//datei lesen
//dateiinhalt als string zurückgeben

static char g_szWerte[4096];

MIGDLL_API const char* MesswertHolen(const char* lpszWindow, const char* lpszDateiname, int nTimeout)
{
nTimeout *= 1000; //parameter sekunden in millisekunden

int nRes = 0 , npos = 0;
BOOL bSucc = TRUE;
HWND hwndRestore = 0;
CString strPath(lpszDateiname);
npos = strPath.ReverseFind('/');
if( npos < 0)
npos = strPath.ReverseFind('\\');

if (npos >= 0)
strPath = strPath.Left(npos+1);

//druckdatei löschen
WIN32_FIND_DATA fd;
HANDLE hFind = ::FindFirstFile(lpszDateiname, &fd);
if (hFind == INVALID_HANDLE_VALUE)
{
Sleep(100);
}
else
{
while (1)
{
bSucc = ::DeleteFile(strPath+fd.cFileName);
if (!::FindNextFile(hFind,&fd))
break;
}

}

::FindClose(hFind);


//auf messprogramm umschalten
while (1)
{
HWND hwnd = ::FindWindow(NULL, lpszWindow);
if (hwnd)
{
hwndRestore = ::GetForegroundWindow();

::ShowWindow(hwnd, SW_SHOWMAXIMIZED);
::SetFocus(hwnd);
bSucc = ::SetForegroundWindow(hwnd);
break;
}
else
{
nRes = ::MessageBox(NULL, "Bitte Messprogramm starten!"
, "Messprogramm nicht gefunden!"
, MB_RETRYCANCEL|MB_ICONERROR|MB_SYSTEMMODAL|MB_SETFOREGROUND);
if (nRes == IDCANCEL)
{
strcpy(g_szWerte, "### Abgebrochen durch Benutzer!");
return g_szWerte;
}
else
{
continue;
}
}
}

//warten bis druckdatei erzeugt (timeout und cancel button)
char szReport[4096] = {0};

DWORD dw = ::GetTickCount();
while (1)
{
if (::GetTickCount() - dw > nTimeout)
{
nRes = ::MessageBox(NULL, "Erneut versuchen?"
, "Timeout beim Durchführen der Messung"
, MB_RETRYCANCEL|MB_ICONERROR|MB_SYSTEMMODAL|MB_SETFOREGROUND);
if (nRes == IDCANCEL)
{
strcpy(g_szWerte, "### Abgebrochen durch Benutzer!");
//forms wieder in den vordergrund
::ShowWindow(hwndRestore, SW_SHOWMAXIMIZED);
::SetFocus(hwndRestore);
bSucc = ::SetForegroundWindow(hwndRestore);
return g_szWerte;
}
else
{
dw = ::GetTickCount();
continue;
}
}

//warten bis druckerausgabe verfügbar
WIN32_FIND_DATA fd;
HANDLE hFind = ::FindFirstFile(lpszDateiname, &fd);
if (hFind == INVALID_HANDLE_VALUE)
{
::FindClose(hFind);
Sleep(100);
continue;
}

::FindClose(hFind);

Sleep(500); //sicherheitshalber warten bis komplett geschrieben

FILE* fp =fopen(strPath+fd.cFileName, "r");
if (fp)
{
//datei lesen
memset(szReport, 0, sizeof(szReport));
int n = fread(szReport, 1, sizeof(szReport), fp);
if (n <= 0)
{
fclose(fp);

nRes = ::MessageBox(NULL, "Erneut versuchen?"
, "Fehler beim Lesen der Dateib"
, MB_RETRYCANCEL|MB_ICONERROR|MB_SYSTEMMODAL|MB_SETFOREGROUND);
if (nRes == IDCANCEL)
{
strcpy(g_szWerte, "### Abgebrochen durch Benutzer!");
//forms wieder in den vordergrund
::ShowWindow(hwndRestore, SW_SHOWMAXIMIZED);
::SetFocus(hwndRestore);
bSucc = ::SetForegroundWindow(hwndRestore);
return g_szWerte;
}
else
{
dw = ::GetTickCount();
continue;
}
}

fclose(fp);
break;
}
}

//datei parsen entfällt :-)

//forms wieder in den vordergrund
::ShowWindow(hwndRestore, SW_SHOWMAXIMIZED);
::SetFocus(hwndRestore);
bSucc = ::SetForegroundWindow(hwndRestore);

//werte zurückgeben
strcpy(g_szWerte, szReport);
return g_szWerte;
}