2011-12-20 11 views
3

私は、スタンバイ(サスペンド)から再開すると事実上クラッシュするいくつかのWindows CE 5.0デバイスに問題があります。私は単純にメッセージボックスを表示するには、wxWidgetsのを取得するために、C++の約15行まで問題を凝縮している、と私ならば問題がヒットします:wxWidgets wxWinCE suspend-resume crash(VC++)

  1. 私が意味する。このことにより、アプリ
  2. デバイスをサスペンドする(開始します赤色の電源ボタンを短く押す)
  3. デバイスを再開する
  4. メッセージボックスのタイトルの[OK]ボタンを押します。私はそれを下に凝縮する前
  5. BOOM

この問題は、他の多くの方法で自分自身を明らかに - それが中断されているすべての後に、バーコードをスキャンするには、ビットマップをロードするには、その後再開しました。

私は次のように使用しています:

  1. のWindows CE 5.0 Professionalの(モトローラMC3090デバイス) (も)MC55(6.5 WM、CE 6.0(MC3190))
  2. のVisual Studio 2005 SP2
  3. wxWidgetsの2.8.10
  4. のMicrosoft Windows CE 5.0標準SDK

表示される実際のエラーがsであります(通常はデバイスを一時停止し、VSデバッガをデバイスに接続することでこれを検出します)、アクセス違反です。これについて大規模な宿題をして、ヒープの破損が発生する可能性があるという示唆を読んだ。アプリが一時停止しない限り、SDKとデバイスのすべての正しい組み合わせで常に正しく動作します。

  1. MSのPocket PC 2003 SDK
  2. シンボルプラットフォームSDK MC3000c50aため
  3. シンボルプラットフォームSDK MC3000c50b
  4. のWindows Mobile 5.0 SDKの
  5. のWindows:

    は、私はまた、次のSDKを試してみましたモバイル6.0 SDK

- 同じ問題

  • MC55(のWindows Mobile 6.5) - 同じ問題
  • MC3190(のWindows CE 6.0) - 問題は、このデバイスでは発生しません

    1. MC3090(のWindows CE 5.0):次のデバイスをテストしましたStandardSDKビルドで

    私はwxWidgetsの設定で過度に演奏していましたが、私は常に適切なSDKにアプリケーションをリンクしていることを確認しています。ここで

    は、この問題が発生するコードです:そこにいくつかのアドバイスと

    #include "wx/wxprec.h" 
    class Application : public wxApp { 
    public: 
        virtual bool OnInit(); 
    }; 
    
    bool Application::OnInit() { 
        wxMessageBox(L"Test"); 
        return true; 
    } 
    
    IMPLEMENT_APP(Application) 
    

    誰でも、私は永遠に感謝されます!私が重要な細部を省いているかどうか私にも教えてください。

  • 答えて

    2

    SDカードからアプリケーションを実行していますか? MC3090は、少なくとも、MC55も、デフォルトでアドオンバス(PCMCIAカード用に定義されていた)のWindows CE標準に準拠しています。つまり、デバイスを一時停止して再開すると、すべてのバスがリセットされます。これにより、カードが一時的に消え、カード上で開いたファイルに対するすべてのハンドルが無効になります。これは、実際には、デバイスが中断されている間にデバイスを使用してカードを交換するユーザーに対処できるようにするためです。

    Windows CEは、デマンドページオペレーティングシステムです。プログラムは起動時にすべてRAMにロードされるわけではありません。代わりに、ページはプログラムによって参照されるときに実行可能ファイルとDLLからロードされます。読み取り専用ページまたは未修正ページは、元のプログラムファイルから読み込むことができるため、いつでもOSによって破棄することができます(これが、プログラムが実行されている場合にプログラムファイルを上書きすることができない理由です)。 EXEまたはDLLへのハンドルが無効にされ、ロードされていない(または破棄された)ページを参照すると、OSページフォルトハンドラはそのページを読み取ることができず、アクセス違反例外が生成されます。

    MC3090では、スリープから復帰したときにカードを「取り外す」ことができないようにSDカードドライバを設定できます。詳細については、SymbolのKB記事MC30xx CE5.0 - Application aborting randomly when using SD Cardを参照してください。私はMC55でこれを行う方法の詳細を見つけることができません。 MC70には、システムコントロールパネルに「SDSwitch」アプレットがありました。その主な機能は、メモリカードとSDIOモードを切り替えることでしたが、このオプションを制御するチェックボックスもありました。他のデバイスの中には、\ WindowsフォルダにCABファイルが封入されているものがあります。MC65やES400でこれを思い出すようです。