Hallo Forum,
arbeite gerade an einem Programm das je nach Compiler Einstellung entweder Unicode oder ANSI compiliert werden kann. Also alles mit TCHAR etc. Da ich mich da noch nicht wirklich auskenne wäre es nett wenn jemand mal folgenden Code oberflächlich durchsehen könnte:
Ich dachte gerade bei Funktionen wie _tcsncat wäre es bei dem Parameter size_t wichtig das man da * sizeof (TCHAR) macht, jedoch stürzt mir mein Programm damit immer ab. Ohne gehts wunder bar, nur ist es auch korrekt so? und wenn ja, warum?
Und nochwas, folgender Code:
verursacht beim Compilieren folgende Warnungen:
Vielen Dank schon mal für eure Hilfe!
arbeite gerade an einem Programm das je nach Compiler Einstellung entweder Unicode oder ANSI compiliert werden kann. Also alles mit TCHAR etc. Da ich mich da noch nicht wirklich auskenne wäre es nett wenn jemand mal folgenden Code oberflächlich durchsehen könnte:
Code:
#include <windows.h>
#include <stdio.h>
#include <TCHAR.h>
#include "resource.h"
int Tourupload (TCHAR * szPathNameFile, TCHAR * szPathNameDevice)
{
FILE * fDevice;
FILE * fBackOffice;
TCHAR szTerminalID[MAX_CHAR_TERMINAL_ID + 1];
TCHAR szBuffer[MAX_PATH];
TCHAR szLine[MAX_CHAR_SATZ];
// Terminal ID Datei öffnen
_tcsncpy (szBuffer, szPathNameDevice, MAX_PATH);
_tcsncat (szBuffer, TEXT ("id.txt"), 6);
fDevice = _tfopen (szBuffer, TEXT ("r"));
if (!fDevice)
return ERR_FILE_NOT_FOUND;
// Terminal ID auslesen
if (!_fgetts (szTerminalID, 21, fDevice))
{
fclose (fDevice);
return ERR_READ_TERMINAL_ID;
}
szTerminalID[20] = '\0';
while (!fclose (fDevice));
// Datendatei auf Gerät anlegen
_tcsncpy (szBuffer, szPathNameDevice, MAX_PATH);
_tcsncat (szBuffer, TEXT ("daten.txt"), 10);
fDevice = _tfopen (szBuffer, TEXT ("w"));
if (!fDevice)
return ERR_DEVICE_NOT_FOUND;
// Datendatei im BackOffice öffnen
_tcsncpy (szBuffer, szPathNameFile, MAX_PATH);
_tcsncat (szBuffer, szTerminalID, 21);
_tcsncat (szBuffer, TEXT (".txt"), 5);
fBackOffice = _tfopen (szBuffer, TEXT ("r"));
if (!fBackOffice)
{
fclose (fDevice);
return ERR_FILE_NOT_FOUND;
}
// Daten auf Gerät kopieren
while (_fgetts (szLine, MAX_CHAR_SATZ, fBackOffice))
{
if (EOF == _fputts (szLine, fDevice))
{
fclose (fDevice);
fclose (fBackOffice);
return ERR_WRITE_TO_DEVICE;
}
}
fclose (fDevice);
fclose (fBackOffice);
// Datei im BackOffice löschen
if (_tremove (szBuffer))
return ERR_DELETE_FILE_ON_OFFICE;
return 0;
}
int Tourdownload (TCHAR * szPathNameFile, TCHAR * szPathNameDevice)
{
FILE * fDevice;
FILE * fBackOffice;
TCHAR szBuffer[MAX_PATH];
TCHAR szLine[MAX_CHAR_SATZ];
TCHAR szLfdnr[MAX_CHAR_LFDNR + 1];
TCHAR SearchName[MAX_PATH];
HANDLE hFile;
WIN32_FIND_DATA FindData;
_tcsncpy (SearchName, szPathNameDevice, MAX_PATH);
_tcsncat (SearchName, TEXT ("*"), 2);
hFile = FindFirstFile (SearchName, &FindData);
do
{
if (FindData.cFileName[0] == '2' && _tcslen (FindData.cFileName) == 7)
{
// Datendatei auf Gerät öffnen
_tcsncpy (szBuffer, szPathNameDevice, MAX_PATH);
_tcsncat (szBuffer, FindData.cFileName, 8);
fDevice = _tfopen (szBuffer, TEXT ("r"));
if (!fDevice)
return ERR_FILE_NOT_FOUND;
// Laufende Nummer auslesen
if (!_fgetts (szLfdnr, 6, fDevice))
{
fclose (fDevice);
return ERR_READ_LFDNR;
}
szLfdnr[5] = '\0';
rewind (fDevice);
// Datendatei im BackOffice anlegen
_tcsncpy (szBuffer, szPathNameFile, MAX_PATH);
_tcsncat (szBuffer, szLfdnr, 6);
_tcsncat (szBuffer, FindData.cFileName, 8);
fBackOffice = _tfopen (szBuffer, TEXT ("w"));
if (!fBackOffice)
{
fclose (fDevice);
return ERR_OFFICE_NOT_FOUND;
}
// Daten vom Gerät kopieren
while (_fgetts (szLine, MAX_CHAR_SATZ, fDevice))
{
if (_fputts (szLine, fBackOffice))
{
fclose (fDevice);
fclose (fBackOffice);
return ERR_WRITE_TO_OFFICE;
}
}
while (!fclose (fDevice));
while (!fclose (fBackOffice));
// Datei von Gerät löschen
_tcsncpy (szBuffer, szPathNameDevice, MAX_PATH);
_tcsncat (szBuffer, FindData.cFileName, 8);
if (_tremove (szBuffer))
return ERR_DELETE_FILE_ON_DEVICE;
}
} while (FindNextFile (hFile, &FindData));
return 0;
}
BOOL LoadSetup (DATA_TO_STORE * pdts)
{
DATA_TO_STORE dts;
TCHAR szPath[MAX_PATH];
TCHAR * temp;
FILE * fSetupFile;
dts = * pdts;
// Aktuellen Pfad ermitteln
if( !GetModuleFileName( NULL, szPath, MAX_PATH - 1))
return FALSE;
temp = _tcsrchr(szPath,'\\');
if (temp == NULL)
{
return FALSE;
}
else
{
temp++;
* temp = '\0';
}
// Setupdatei öffnen
_tcsncat (szPath, TEXT ("config.ini"), min (10, MAX_PATH - _tcslen(szPath) / sizeof(TCHAR)));
fSetupFile = _tfopen (szPath, TEXT ("r"));
if (!fSetupFile)
return FALSE;
// Setup lesen
if (fread (&dts, sizeof (DATA_TO_STORE), 1, fSetupFile) == 1)
{
* pdts = dts;
fclose (fSetupFile);
return TRUE;
}
else
{
fclose (fSetupFile);
return FALSE;
}
}
BOOL SaveSetup (DATA_TO_STORE * pdts)
{
DATA_TO_STORE dts;
TCHAR szPath[MAX_PATH];
TCHAR * temp;
FILE * fSetupFile;
dts = * pdts;
// Aktuellen Pfad ermitteln
if( !GetModuleFileName( NULL, szPath, MAX_PATH - 1))
return FALSE;
temp = _tcsrchr(szPath,'\\');
if (temp == NULL)
{
return FALSE;
}
else
{
temp++;
* temp = 0;
}
// Datendatei auf Gerät öffnen
_tcsncat (szPath, TEXT ("config.ini"), min (10, MAX_PATH - _tcslen(szPath) / sizeof(TCHAR)));
fSetupFile = _tfopen (szPath, TEXT ("w"));
if (!fSetupFile)
return FALSE;
// Setup speichern
if (fwrite (&dts, sizeof (DATA_TO_STORE), 1, fSetupFile) == 1)
{
fclose (fSetupFile);
return TRUE;
}
else
{
fclose (fSetupFile);
return FALSE;
}
}
Ich dachte gerade bei Funktionen wie _tcsncat wäre es bei dem Parameter size_t wichtig das man da * sizeof (TCHAR) macht, jedoch stürzt mir mein Programm damit immer ab. Ohne gehts wunder bar, nur ist es auch korrekt so? und wenn ja, warum?
Und nochwas, folgender Code:
Code:
// Struktur für die Setup Dialogbox
typedef struct
{
TCHAR szPathNameDevice[MAX_PATH];
TCHAR szPathNameFile[MAX_PATH];
} SETUPBOX_DATA;
...
SETUPBOX_DATA sbd;
...
DialogBoxParam (hInstance, TEXT ("SetupBox"), hwnd, BackOfficeSetupDlgProc, &sbd)
verursacht beim Compilieren folgende Warnungen:
Code:
c:\xxx.c(254) : warning C4133: 'Funktion': Inkompatible Typen - von 'BOOL (__stdcall *)(HWND,UINT,WPARAM,LPARAM)' zu 'DLGPROC'
c:\xxx.c(254) : warning C4047: 'Funktion': Anzahl der Dereferenzierungen bei 'LPARAM' und 'SETUPBOX_DATA *__w64 ' unterschiedlich
c:\xxx.c(254) : warning C4024: 'DialogBoxParamW': Unterschiedliche Typen für formalen und übergebenen Parameter 5
Vielen Dank schon mal für eure Hilfe!