[C] Ein paar Fragen zu Unicode Quelltext

Wu-mc

Mitglied
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:

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!
 
Zurück