我想要获得手机驱动器的大小。 我正在使用“Nokia-PC-Connectivity”,并且对于我在CONADifinition函数上找到的文件系统API,名为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   消息:运行时遇到了   致命错误。错误的地址   位于线程0x1278的0x7a0ba769处。   错误代码是0xc0000005。这个   错误可能是CLR或中的错误   不安全或不可核实的部分   用户代码这个的常见来源   错误包括用户编组错误   COM-interop或PInvoke,可能   腐败堆栈。

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

如需更多解释,请问我。

有帮助吗?

解决方案

当您尝试将缓冲区中的数据转换为与最初由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)诺基亚已在内部开发了新版本,但尚未公开发布。

其他提示

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

  1. 查找API通常具有FindFirst,然后是FindNext的迭代,然后是FindClose。我看到你用hFindHandle调用FindNext,但我没有看到它在任何地方被初始化(这通常发生在FindFirst调用中)。如果这是零,那肯定会导致访问冲突。
  2. 如果没有更多的while()循环,它看起来像一个无限循环 - 我假设你在某个地方有另一个FindNext?
  3. 经常查找调用要求传入的结构已完成一些初始化 - 比如设置长度成员。检查您的API文档,看看这是否需要。
  4. 我没有看到你释放你的Buffer变量或关闭find句柄(假设它是有效的)。
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top