Hacer la conversión de Java a c++ no es fácil con la ayuda de los chicos.

quiero ver si estoy recibiendo una Access_Error violación de este código:

BOOL didThisFail = FALSE;

if (CopyFile(L"MyApplication.exe", szPath, didThisFail))
    cout << "File was copied" << endl;
  • Hay algo mal con szPath. Mostrar el código que declara e inicializa.
  • Hans estaba en lo correcto. szPath era sólo un camino (c:\project) y no c:\project\something.exe
InformationsquelleAutor Tom | 2010-12-21

2 Comentarios

  1. 3
    if (CopyFileW(L"MyApplication.exe", szPath, didThisFail))
    {
        std::cout << "File was copied" << std::endl;
    }
    else if (GetLastError() == ERROR_ACCESS_DENIED)
    {
        std::cout << "Can't do that." << std::endl;
    }
    else
    {
        DWORD lastError = GetLastError();
        //You have to cache the value of the last error here, because the call to
        //operator<<(std::ostream&, const char *) may cause the last error to be set
        //to something else.
        std::cout << "General failure. GetLastError returned " << std::hex
        << lastError << ".";
    }
    • Que sólo busca un tipo de error.
    • Funciona.. me estoy poniendo el «no puedo hacer eso», pero no sé por qué.. yo no soy de copiar a una carpeta especial
    • El OP solo se les preguntó acerca de un tipo de error.
    • El OP preguntó específicamente para un tipo de error. Si desea recibir un sistema definido en la cadena de error puede usar el FormatMessage de la API, como se ha hecho aquí.
    • Compruebe Dacl en el origen y el de destino. Asegúrese de que el objetivo no es sólo lectura. De lo contrario, no tengo mucho consejo. Tenga en cuenta que, a menos que su aplicación se está ejecutando elevada, tiene significativamente más débil permisos que sería de otra manera.
    • Lol Billy el problema es que he intentado copiar un Camino y no szPath\\something.exe

  2. -1

    Hay un ejemplo en el sitio web de MSDN: http://msdn.microsoft.com/en-us/library/ms680582(v=vs 85).aspx

    void ErrorExit(LPTSTR lpszFunction) 
    { 
        //Retrieve the system error message for the last-error code
    
        LPVOID lpMsgBuf;
        LPVOID lpDisplayBuf;
        DWORD dw = GetLastError(); 
    
        FormatMessage(
            FORMAT_MESSAGE_ALLOCATE_BUFFER | 
            FORMAT_MESSAGE_FROM_SYSTEM |
            FORMAT_MESSAGE_IGNORE_INSERTS,
            NULL,
            dw,
            MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
            (LPTSTR) &lpMsgBuf,
            0, NULL );
    
        //Display the error message and exit the process
    
        lpDisplayBuf = (LPVOID)LocalAlloc(LMEM_ZEROINIT, 
            (lstrlen((LPCTSTR)lpMsgBuf) + lstrlen((LPCTSTR)lpszFunction) + 40) * sizeof(TCHAR)); 
        StringCchPrintf((LPTSTR)lpDisplayBuf, 
            LocalSize(lpDisplayBuf) / sizeof(TCHAR),
            TEXT("%s failed with error %d: %s"), 
            lpszFunction, dw, lpMsgBuf); 
        MessageBox(NULL, (LPCTSTR)lpDisplayBuf, TEXT("Error"), MB_OK); 
    
        LocalFree(lpMsgBuf);
        LocalFree(lpDisplayBuf);
        ExitProcess(dw); 
    }
    • Ahora «no es confiable»?
    • No, el último error es por subproceso elemento.
    • Acepto la corrección.
    • -1: GetLastError() es completamente fiable.
    • De MSDN, «de las Funciones ejecutadas por el subproceso de llamada establecer este valor llamando a la función SetLastError. Usted debe llamar a la función GetLastError inmediatamente cuando una función de devolución de valor indica que una llamada devolverá datos útiles. Eso es porque algunas funciones de llamada SetLastError con un cero, cuando tienen éxito, acabando con el código de error establecido por la mayoría de los recientemente falló a la función». msdn.microsoft.com/en-us/library/ms679360(v=vs 85).aspx
    • Sí, algunas de las funciones de hacerlo. Pero eso no significa que no se puede hacer de otro hilo.
    • Esto no GetLastError() más fiable que cualquier otra cosa. Esas funciones no van a ser mágicamente llamado. Ellos van a ser llamado por algo hacer. Así que no lo hagas hasta después de que hayas llamado GetLastError()

Dejar respuesta

Please enter your comment!
Please enter your name here