4

我想获得手机驱动器的大小。我正在使用“Nokia-PC-Connectivity”。关于文件系统 API,我在名为 CONA_Folder_Info 的 CONADifinition 函数上找到,但此函数不支持 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 消息:运行时遇到致命错误。错误地址位于线程 0x1278 上的 0x7a0ba769。错误代码为 0xc0000005。此错误可能是 CLR 中的错​​误或用户代码的不安全或不可验证部分中的错误。此错误的常见来源包括 COM 互操作或 PInvoke 的用户封送错误,这可能会损坏堆栈。

注:我使用的是S60 软件平台。应用程序语言是 C#。

如需更多解释,请询问我。

4

2 回答 2

1

当您尝试将缓冲区中的数据转换为与最初由 CONAFileSystem.CONAFindNextFolder 创建的不同类型的结构时,出现异常是正确的。

您正试图将 CONADefinitions.CONAPI_FOLDER_INFO 类型的数据结构强制转换为 CONADefinitions.CONAPI_FOLDER_INFO2 类型的结构。它们几乎肯定有不同的长度等等,所以这种方法极不可能奏效。

根据在 Symbian OS 上进行 C++ 开发的经验,诺基亚很可能在这里使用的模式是,他们随后开发了更新版本的 API,因此创建了更新版本的 CONADefinitions.CONAPI_FOLDER_INFO 结构(即 CONADefinitions.CONAPI_FOLDER_INFO2 )。

假设这是正确的,则有 3 种可能性:
1) 第一个函数有一个枚举参数,它指定要创建哪个版本的输出结构。
2) 有一个返回新结构的新函数,例如 CONAFileSystem.CONAFindFirstFolder2, CONAFileSystem.CONAFindNextFolder2
3) 诺基亚内部开发了新版本,但尚未公开发布。

于 2009-08-04T12:29:39.547 回答
0

我对诺基亚 API 一无所知,但总的来说,我看到以下内容:

  1. Find API 通常有一个 FindFirst,然后是 FindNext 的迭代,然后是 FindClose。我看到你用 hFindHandle 调用 FindNext,但我没有看到它在任何地方被初始化(这通常发生在 FindFirst 调用中)。如果这是零,那肯定会导致访问冲突。
  2. 如果没有更多的 while() 循环,它看起来就像一个无限循环——我假设你在某个地方还有另一个 FindNext?
  3. 通常 Find 调用要求传入的结构完成一些初始化 - 例如设置长度成员。检查您的 API 文档以查看此处是否需要。
  4. 我没有看到您释放 Buffer 变量或关闭查找句柄(假设它有效)。
于 2009-01-03T19:20:27.573 回答