Nokia APIを使用して電話ドライブのサイズ(無料、合計)を取得する方法は?
質問
電話のドライブのサイズを取得したい。 「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#です。
詳細については、お問い合わせください。
解決
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)最初の関数には、作成する出力構造のバージョンを指定する列挙型パラメーターがあります。
2)新しい構造を返す新しい関数があります。 CONAFileSystem.CONAFindFirstFolder2、CONAFileSystem.CONAFindNextFolder2
3)Nokiaは新しいバージョンを社内で開発しましたが、まだ一般公開していません。
他のヒント
Nokia APIについては何も知りませんが、一般的には次のように見えます:
- 通常、Find APIにはFindFirstがあり、その後にFindNextの反復があり、その後FindCloseがあります。 hFindHandleでFindNextを呼び出していますが、どこでも初期化されていません(通常はFindFirst呼び出しで発生します)。これがゼロの場合、確かにアクセス違反が発生する可能性があります。
- while()ループがなければ、無限ループのように見えます-別のFindNextがどこかにあると思いますか
- 多くの場合、Find呼び出しでは、長さメンバーの設定など、着信構造体の初期化が必要です。 APIドキュメントをチェックして、ここで必要かどうかを確認してください。
- Buffer変数を解放したり、検索ハンドルを閉じたりしていません(有効であると仮定)。