2013-05-07 1 views
2

일부 조건에서 오류를 표시하려면 Mac OS X (MessageBox를 사용하는 Windows에서 이식 된 코드)에서 NSRunAlertPanel을 사용하고 있습니다.NSRunAlertPanel을 사용할 때 EXC_BAD_INSTRUCTION

실제 Windows를 만들기 전에 일부 코드가 실행되고이 코드를 호출하여 조건부 오류가 표시됩니다. 스레드 com.apple.libdispatch 매니저에서

,

0 _dispatch_mgr_invoke 
1 _dispatch_mgr_thread 

이 EXC_BAD_INSTRUCTION

윈도우가 NSRunAlertPanel 이전에 생성되지 않기 때문에 그것을인가를주고 호출 스택 다음에서?

이 런타임 오류의 이유는 무엇입니까? 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 * string (넓은 문자열)에서 NSString을 가져 오는 코드는 완벽하게 테스트되었으며 테스트되었습니다. 그것은 많은 장소에서 사용되고 잘 실행됩니다.

다른 응용 프로그램 (이 창을 먼저 만듭니다)에서 동일한 코드가 제대로 실행 중입니다.

File의 소멸자가 호출 될 때 문제가 발생합니다. fd가 0이 아니기 때문에 메시지 박스를 보여주고 문제를 일으킨다.

fd가 0으로 설정되면 생성자에 대한 경고 상자가 표시되지 않습니다. 그러나 다른 경고가 표시되지만 문제는 발생하지 않습니다.

fd가 필요합니까?

+0

아마도 'WideToNSString()'이 (가) 당신의 함수 중 하나입니까? 그렇다면 구현을 게시 할 수 있습니까? – trojanfoe

+0

WidwToNSString 코드가 게시됩니다. 내 기능이고 잘 돌아가고있다. – doptimusprime

+0

죄송합니다. 코드를 컴파일 할 수 없습니다. 정의되지 않은'pStr' (즉'wcslen (pStr)')에 대한 참조가 있습니다. – trojanfoe

답변

0

예외를 유발하는 원인에 대해 충분한 정보를 제공하지 않았습니다 (코드를 보여주십시오). (이 코드는 ARC를 사용할 수있다)

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); 
} 

:

은 내가 거의 내가 원하는 시간에 전화 할 수 있어요 내 애플 리케이션에 치명적인 오류를 표시하는 NSRunCriticalAlertPanel()를 사용합니다.

+0

응용 프로그램이로드 될 때 작업이 수행됩니다. 응용 프로그램을로드 한 후 창을 만듭니다. 응용 프로그램을로드하는 동안 오류를 표시하는 코드를 호출합니다 (창 만들기 전).이 때문에 EXC_BAD_INSTRUCTION 예외가 있습니다. 경고를 표시하는 기능은 작성한 것과 유사합니다. – doptimusprime

+0

@dbasic 알림 패널은 앱 창과 관련이 없습니다. 나는 내가 좋아할 때마다 오류를 표시 할 수있다. (창문이 표시되기 전후 모두). 코드를 게시하십시오. – trojanfoe

+0

경고 패널을 표시하는 코드를 게시했습니다. – doptimusprime