2

簡単なエラー報告パッケージをまとめようとしています。メインプログラムがクラッシュすると、クラッシュログが保存され、レポータープログラムが起動します。レポータープログラムは、クラッシュログを私に送信できるかどうかをユーザーに尋ね、それを送信します。NSRunAlertPanelを使用して基本的なメッセージボックスを作成しています。

何らかの理由で、そのメッセージボックスは、開いている可能性のある他のウィンドウの下に埋め込まれて表示されています。Finderウィンドウからメインパッケージを実行すると、メインパッケージが上部に表示され、強制的にクラッシュします。レポーターウィンドウはFinderウィンドウの後ろに表示されます。

なぜこれが起こっているのですか、そしてそれをどのように解決することができますか?

最小限のテストケース:

#import <AppKit/AppKit.h>

int main(int a, char* av) {
  NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];
  NSApplication* q = [[NSApplication alloc] init]; 
  NSRunAlertPanel(@"Hello", @"Aloha", @"OK", nil,nil);
  [pool release];
} 

で構築:

g++ test.mm -framework AppKit && ./a.out
4

1 に答える 1

2

私は、接線方向に関連する多くのWebページから抽出した解決策を考え出したようです。

#import <AppKit/AppKit.h>

int main(int a, char* av) {
  NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];
  NSApplication* q = [[NSApplication alloc] init]; 

  ProcessSerialNumber psn = {0, kCurrentProcess};
  TransformProcessType(&psn, kProcessTransformToForegroundApplication);

  [NSApp activateIgnoringOtherApps:YES];

  NSRunAlertPanel(@"Hello", @"Aloha", @"OK", nil,nil);
  [pool release];
} 

私はこれを理解するふりをしません-それは最高のカーゴカルトプログラミングです。より良い答え、または各ステップが何をするかについての説明をいただければ幸いです。

于 2010-04-14T18:35:14.750 に答える