为了在某些情况下显示错误,我在 Mac OS X 上使用 NSRunAlertPanel(在从 Windows 移植的代码上,我在其中使用 MessageBox)。
在实际创建 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 时,构造函数不显示警告框。但是,显示其他警报但没有发生问题。
是fd到期了吗?