2

ある条件でエラーを表示するために、Mac OS X で NSRunAlertPanel を使用しています (MessageBox を使用していた Windows から移植されたコードで)。

実際に Windows を作成する前に、いくつかのコードが実行され、このコードを呼び出して条件付きエラーを表示します。

スレッド com.apple.libdispatch-manager で、次のコール スタックの下

0 _dispatch_mgr_invoke
1 _dispatch_mgr_thread

それはEXC_BAD_INSTRUCTIONを与えています

NSRunAlertPanel の前に Windows が作成されていないためでしょうか。

この実行時エラーの理由は何ですか? Mac OS X の MessageBox の正確な代替手段は何ですか?

Long ShowDebugMessageBox (const wchar_t * Message, const wchar_t * Title)
{
    NSString *  message;    ///< Message.
    NSString *  title;      ///< Title.
    NSInteger   response;   ///< response.

message     = WideToNSString (Message);
title       = WideToNSString (Title);


    //response    = NSRunAlertPanel(title, message, @"Yes", @"No", @"Cancel");
    response       = NSRunCriticalAlertPanel (title, message, @"Okay", @"Cancel", nil);

    switch(response) {
    case NSAlertDefaultReturn:
        return IDYES;
    case NSAlertAlternateReturn:
        return IDNO;

    default:
        return IDCANCEL;
    }

}


NSString *  WideToNSString (const wchar_t * Str)
{
if(!Str) {
    return nil;
}

    NSString *  str;    ///< String in NSString.
#if CP_SIZEOFWCHAR == 4
    str     = [[NSString alloc] initWithBytes: (CVPtr) Str
                                length: sizeof(wchar_t)* wcslen(Str)
                                encoding: NSUTF32LittleEndianStringEncoding];
                                //encoding: NSUTF32StringEncoding];
#else

    str     = [[NSString alloc] initWithBytes: (CVPtr) Str
                                length: sizeof(wchar_t)* wcslen(Str);
                                encoding: NSUTF16LittleEndianStringEncoding];
                                //encoding: NSUTF16StringEncoding];
#endif

return str;
}

class File {
public:
  int Open(char * fname, int mode)
  {
    fd = open(fname,  mode);

 }

  int Close()
  {
     close(fd);
     //fd = 0; //CAUSE of the PROBLEM
   }

  ~File ()
   {
     //ALERT Display message box about the error.
     ALERT(fd != 0);
   }

private:
 int fd;

};

メッセージボックスを表示するコードです。

wchar_t * 文字列 (ワイド文字列) から NSString を取得するコードは問題なく、テスト済みです。多くの場所で使用されており、問題なく動作しています。

他のアプリケーション(最初にウィンドウを作成する)の同じコードは正常に実行されています。

File のデストラクタが呼び出されると問題が発生します。fd が 0 ではないため、メッセージ ボックスが表示され、問題が発生します。

fd が 0 に設定されている場合、コンストラクターの警告ボックスは表示されません。ただし、その他のアラートは表示されますが、問題は発生していません。

それは期限切れですか?

4

1 に答える 1

0

例外の原因を説明するのに十分な情報が提供されていません (コードを表示してください)。

私は自分のアプリで致命的なエラーを表示するために使用NSRunCriticalAlertPanel()しており、好きなときにいつでも呼び出すことができます。

void criticalAlertPanel(NSString *title, NSString *fmt, ...)
{
    va_list va;
    va_start(va, fmt);
    NSString *message = [[NSString alloc] initWithFormat:fmt arguments:va];
    va_end(va);
    NSRunCriticalAlertPanel(title, message, @"OK", nil, nil);
}

(このコードは ARC 対応です)。

于 2013-05-07T08:25:42.497 に答える