2

为了在某​​些情况下显示错误,我在 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到期了吗?

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 回答