ある条件でエラーを表示するために、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 に設定されている場合、コンストラクターの警告ボックスは表示されません。ただし、その他のアラートは表示されますが、問題は発生していません。
それは期限切れですか?