HANDLE/CFile Problem



  • Hi

    {
    	// TODO: Add your control notification handler code here
    	HANDLE hFile=CreateFile(_T("profile\test.txt"),
             FILE_ALL_ACCESS, FILE_SHARE_WRITE,
             NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
    if (hFile == INVALID_HANDLE_VALUE)
    	AfxMessageBox(_T("konnts ned öffnen"));
    	CFile profile(hFile);
    char lala[]="erste benutzung der write funktion";
    profile.Write(lala, lstrlen(lala));
    }
    

    Beim kompillieren entsteht folgender Fehler:
    cannot conver Paramter 1 drom void* to int

    ich hab den code aber relativ gleich aus der MSDN übernommen, was mach ich fals? 😕 😃

    mfg
    thenoob



  • Hallo,

    du benötigst einen cast, außerdem ist ein Fehler in der Schreibweise der Datei (Escape-Sequenz beachten!), und noch außerdem solltest du nach der Messagebox nicht trotzdem ein CFile-Objekt erstellen:

    {
        // TODO: Add your control notification handler code here
        HANDLE hFile=CreateFile(_T("profile\\test.txt"),
             FILE_ALL_ACCESS, FILE_SHARE_WRITE,
             NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
        if (hFile == INVALID_HANDLE_VALUE)
            AfxMessageBox(_T("konnts ned öffnen"));
        else
        {
            CFile profile(reinterpret_cast<int>(hFile));
            char lala[]="erste benutzung der write funktion";
            profile.Write(lala, lstrlen(lala));
        }
    }
    

    MfG



  • ok vielen Dank
    aber was genau is dieser Cast?
    und wieso brauch ich den?

    mfg
    thenoob



  • der Konstruktor von CFile:

    CFile( int hFile );

    erwartet einen int, aber hFile ist ein "verkappter" void-Zeiger(void*), ein HANDLE:

    HANDLE hFile=CreateFile(_T("profile\\test.txt"),
    FILE_ALL_ACCESS, FILE_SHARE_WRITE,
    NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);

    C++ ist eine typsichere Sprache, und achtet genau darauf, ob die Typen "kompatibel" sind, wenn nicht, meckert der Compiler, also hier:

    CFile profile(hFile);

    Hier haben wir einen deutlichen Fall: ein Zeiger soll als int-Parameter behandelt werden, und deswegen muß man dies über einen cast explizit anfordern:

    CFile profile(reinterpret_cast<int>(hFile));

    MfG



  • Wenn du schon CFile verwendest kannst du es auch gleich zum öffnen/neuesfile verwenden.

    CFile fFile;
    CFileException *feError = NULL;
    
    m_fFile.Open(szFile, CFile::modeCreate | CFile::modeReadWrite | CFile::shareDenyWrite ,feError))
    

Anmelden zum Antworten