¿Cómo obtener el tamaño (gratuito, total) de la unidad del teléfono utilizando la API de Nokia?
Pregunta
Quiero obtener el tamaño de la unidad de teléfono. Estoy usando " Nokia-PC-Connectivity ". variables.
Pero cuando utilicé CONA_Folder.Info2 de la siguiente manera:
CONADefinitions.CONAPI_FOLDER_INFO2 FolderInfo;
int iResult = 0;// Allocate memory for buffer
IntPtr Buffer = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(CONADefinitions.CONAPI_FOLDER_INFO2)));
iResult = CONAFileSystem.CONAFindNextFolder(hFindHandle, Buffer);
while (iResult == PCCSErrors.CONA_OK )
{
FolderInfo = (CONADefinitions.CONAPI_FOLDER_INFO2)Marshal.PtrToStructure(Buffer, typeof(CONADefinitions.CONAPI_FOLDER_INFO2));
if (FolderInfo.pstrName[0].ToString() != "C" && level == 0)
{
}
Obtengo esta excepción:
Se detectó FatalExecutionEngineError Mensaje: El tiempo de ejecución ha encontrado un error fatal. La dirección del error. estaba en 0x7a0ba769, en el hilo 0x1278. El código de error es 0xc0000005. Esta error puede ser un error en el CLR o en las partes inseguras o no verificables del código de usuario. Fuentes comunes de este error incluye errores de cálculo de usuario para COM-interop o PInvoke, que puede corromper la pila.
Nota: utilizo la plataforma de software S60 . El lenguaje de aplicación es C #.
Para más explicaciones por favor pregúntame.
Solución
Es correcto que obtenga la excepción cuando intenta convertir los datos en el búfer a un tipo de estructura diferente al que fue creado originalmente por CONAFileSystem.CONAFindNextFolder.
Está intentando forzar una estructura de datos de tipo CONADefinitions.CONAPI_FOLDER_INFO en una estructura de tipo CONADefinitions.CONAPI_FOLDER_INFO2. Es casi seguro que tienen diferentes longitudes, etc., por lo que es extremadamente improbable que este método funcione.
A partir de la experiencia con el desarrollo de C ++ en el sistema operativo Symbian, es probable que el patrón que Nokia esté utilizando aquí sea uno en el que posteriormente haya desarrollado una versión más nueva de la API y, por lo tanto, haya creado una versión más nueva de la estructura CONADefinitions.CONAPI_FOLDER_INFO (es decir, CONADefinitions.CONAPI_FOLDER_INFO2).
Suponiendo que esto es correcto, hay 3 probabilidades:
1) Hay un parámetro de enumeración para la primera función que especifica qué versión de la estructura de salida se creará.
2) Hay una nueva función que devuelve la nueva estructura, p. ej. CONAFileSystem.CONAFindFirstFolder2, CONAFileSystem.CONAFindNextFolder2
3) Nokia ha desarrollado la nueva versión internamente, pero aún no la ha lanzado públicamente.
Otros consejos
No sé nada acerca de la API de Nokia, pero en general veo lo siguiente:
- Las API de búsqueda suelen tener un FindFirst, seguido de iteraciones de FindNext y luego un FindClose. Veo que llama a FindNext con hFindHandle, pero no veo que se inicialice en ningún lugar (lo que suele suceder en una llamada FindFirst). Si esto es cero, ciertamente podría dar una violación de acceso.
- Sin más de tu bucle while () parece un bucle sin fin. ¿Supongo que tienes otro FindNext en alguna parte?
- A menudo, las llamadas de búsqueda requieren que la estructura entrante tenga alguna inicialización hecha, como establecer un miembro de longitud. Verifique sus documentos API para ver si se requiere aquí.
- No te veo liberando tu variable Buffer o cerrando el identificador de búsqueda (suponiendo que sea válido).