일부 조건에서 오류를 표시하려면 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가 필요합니까?
아마도 'WideToNSString()'이 (가) 당신의 함수 중 하나입니까? 그렇다면 구현을 게시 할 수 있습니까? – trojanfoe
WidwToNSString 코드가 게시됩니다. 내 기능이고 잘 돌아가고있다. – doptimusprime
죄송합니다. 코드를 컴파일 할 수 없습니다. 정의되지 않은'pStr' (즉'wcslen (pStr)')에 대한 참조가 있습니다. – trojanfoe