Visualizzazione dei risultati da 1 a 5 su 5

Discussione: [c++]wchar

  1. #1
    Utente di HTML.it
    Registrato dal
    Jun 2003
    Messaggi
    4,826

    [c++]wchar

    ciao.
    Ho dei file .bat con dei caratteri particolari(%&& ecc...)nel path e vorrei lanciarli da c++.
    Il problema è che con quei caratteri il normale winexec non funziona.
    invece la shellexecute funziona correttamente.

    codice:
    ShellExecute(NULL, "open","prova.bat", NULL, "C:\\pc()%&", 1);
    ora: i parametri stringa sono dei wchar , che credo siano dei char doppi , da quello che ho capito.
    la shellexecute lancia questi file perchè è una funzione fatta per i windows a 32 bit invece che a 16 come winexec o cosa?
    e centra qualcosa l'unicode?
    scusate ma ho un po di confusione su queste problematiche e vorrei capire.
    grazie.

  2. #2
    WinExec è una funzione deprecata da almeno 15 anni... Usa la CreateProcess.
    Amaro C++, il gusto pieno dell'undefined behavior.

  3. #3
    Utente di HTML.it
    Registrato dal
    Jun 2003
    Messaggi
    4,826
    Grazie, Mitaly, riesco ad usare la createprocess ma non la createprocessw , che mi serve per accedere ai file sotto delle directory con caratteri speciali.
    questo è il codice:
    codice:
    STARTUPINFOW si;
    	PROCESS_INFORMATION pi;
    
        ZeroMemory( &si, sizeof(si) );
        si.cb = sizeof(si);
        ZeroMemory( &pi, sizeof(pi) );
    
        
    
        // Start the child process. 
        if( !CreateProcessW( NULL,   // No module name (use command line)
    		L"c:\\prova.bat",        // Command line
            NULL,           // Process handle not inheritable
            NULL,           // Thread handle not inheritable
            FALSE,          // Set handle inheritance to FALSE
            0,              // No creation flags
            NULL,           // Use parent's environment block
            NULL,           // Use parent's starting directory 
            &si,            // Pointer to STARTUPINFO structure
            &pi )           // Pointer to PROCESS_INFORMATION structure
        ) 
        {
            printf( "CreateProcess failed (%d).\n", GetLastError() );
            return 0;
        }
    
        // Wait until child process exits.
        WaitForSingleObject( pi.hProcess, INFINITE );
    
        // Close process and thread handles. 
        CloseHandle( pi.hProcess );
        CloseHandle( pi.hThread );
    e questo l'errore , va in crash , non restituisce un errore alla printf.
    Unhandled exception at 0x7c82f284 (kernel32.dll) in testchar.exe: 0xC0000005: Access violation writing location 0x00425070.

    non riesco a capire quel kernerl32.
    ciao.

  4. #4
    Così ad occhio non vedo nulla di sbagliato, probabilmente il problema deriva dalla mescolanza di stringhe ANSI e Unicode, ma non vedo errori a tal proposito, prova a mettere i warning a paletta.
    Per inciso, personalmente ti sconsiglio di usare esplicitamente le versioni ANSI o Unicode delle API, imposta tutto il progetto per Unicode, usa i TCHAR e richiama le funzioni con i loro nomi "normali", così sei sicuro di non fare casini.
    Amaro C++, il gusto pieno dell'undefined behavior.

  5. #5
    Utente di HTML.it
    Registrato dal
    Jun 2003
    Messaggi
    4,826
    grazie.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.