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++ 開発の経験から、Nokia がここで使用している可能性が高いパターンは、その後 API の新しいバージョンを開発し、新しいバージョンの CONADefinitions.CONAPI_FOLDER_INFO 構造体 (つまり、CONADefinitions.CONAPI_FOLDER_INFO2) を作成したパターンです。 )。

これが正しいと仮定すると、次の 3 つの可能性が
あります。1) 最初の関数には、作成する出力構造のバージョンを指定する enum パラメータがあります。
2) 新しい構造を返す新しい関数があります。たとえば、CONAFileSystem.CONAFindFirstFolder2、CONAFileSystem.CONAFindNextFolder2
3) ノキアは新しいバージョンを社内で開発しましたが、まだ公開していません。

于 2009-08-04T12:29:39.547 に答える
0

Nokia API については何も知りませんが、一般的には次のように表示されます。

  1. 通常、検索 API には FindFirst があり、FindNext の反復と FindClose が続きます。hFindHandle を使用して FindNext を呼び出していることがわかりますが、どこにも初期化されていないことがわかります (これは通常、FindFirst 呼び出しで発生します)。これがゼロの場合、アクセス違反が発生する可能性があります。
  2. while() ループがこれ以上ないと、無限ループのように見えます。どこかに別の FindNext があると思いますか?
  3. 多くの場合、Find 呼び出しでは、長さメンバーの設定など、着信構造体に何らかの初期化が行われている必要があります。API ドキュメントをチェックして、ここで必要かどうかを確認してください。
  4. Buffer 変数を解放したり、検索ハンドルを閉じたりすることはありません (有効であると仮定します)。
于 2009-01-03T19:20:27.573 に答える