Как получить размер (свободный, общий) диска телефона с помощью Nokia API?

StackOverflow https://stackoverflow.com/questions/409487

  •  03-07-2019
  •  | 
  •  

Вопрос

Я хочу получить размер телефонного диска.Я использую "Nokia-PC-Connectivity"., и что касается API файловой системы, я нашел в CONADifinition функцию под названием CONA_Folder_Info, но эта функция не поддерживает FreeSize и Total Size, но есть CONA_Folder .Info2 и его экземпляр поддерживают эти переменные.

Но когда я использовал CONA_Folder.Info2 следующим образом:

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) 
  {
  }

Я получаю это исключение:

Была обнаружена ошибка FatalExecutionEngineError Сообщение:Среда выполнения обнаружила неустранимую ошибку.Адрес ошибки был в 0x7a0ba769, в потоке 0x1278.Код ошибки - 0xc0000005.Эта ошибка может быть ошибкой в среде CLR или в небезопасных или не поддающихся проверке частях пользовательского кода.Распространенные источники этой ошибки включают ошибки маршалинга пользователей для COM-interop или PInvoke, которые могут повредить стек.

Примечание:Я использую Программная платформа S60.Язык приложения - C #.

За дополнительными объяснениями, пожалуйста, обращайтесь ко мне.

Это было полезно?

Решение

Правильно, что вы получаете исключение при попытке преобразовать данные в буфере в структуру другого типа, чем та, которая была изначально создана CONAFileSystem.CONAFindNextFolder.

Вы пытаетесь принудительно преобразовать структуру данных типа CONADefinitions.CONAPI_FOLDER_INFO в структуру типа CONADefinitions.CONAPI_FOLDER_INFO2.Они почти наверняка имеют разную длину и так далее, поэтому крайне маловероятно, что этот метод когда-либо сработает.

Исходя из опыта разработки на C ++ для ОС Symbian, шаблон, который Nokia, вероятно, будет использовать здесь, - это тот, по которому они впоследствии разработали более новую версию API и, таким образом, создали более новую версию CONADefinitions.Структура CONAPI_FOLDER_INFO (т. е.Определения.CONAPI_FOLDER_INFO2).

Предполагая, что это правильно, существует 3 вероятности:
1) В первой функции есть параметр enum, который указывает, какая версия выходной структуры должна быть создана.
2) Существует новая функция, которая возвращает новую структуру, напримерCONAFileSystem.CONAFindFirstFolder2, CONAFileSystem.CONAFindNextFolder2
3) Nokia разработала новую версию внутри компании, но еще не выпустила ее публично.

Другие советы

Я ничего не знаю о Nokia API, но в целом я вижу следующее:

  1. API поиска обычно имеют findFirst, за которыми следуют итерации FindNext, а затем FindClose .Я вижу, что вы вызываете FindNext с помощью hFindHandle , но я не вижу, чтобы он где-либо инициализировался (что обычно происходит при вызове findFirst).Если это значение равно нулю, это, безусловно, может привести к нарушению доступа.
  2. Без дополнительного цикла while () это выглядит как бесконечный цикл - я полагаю, у вас где-то есть другой FindNext?
  3. Часто вызовы Find требуют, чтобы входящая структура выполнила некоторую инициализацию - например, установила элемент длины.Проверьте свои документы по API, чтобы узнать, требуется ли это здесь.
  4. Я не вижу, чтобы вы освобождали свою переменную Buffer или закрывали дескриптор find (при условии, что он действителен).
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top