Wine (“Wine Is Not an Emulator” 的首字母缩写)是一个能够在多种 POSIX-compliant 操作系统(诸如 Linux,macOS 及 BSD 等)上运行 Windows 应用的兼容层。Wine 不是像虚拟机或者模拟器一样模仿内部的 Windows 逻辑,而是將 Windows API 调用翻译成为动态的 POSIX 调用,免除了性能和其他一些行为的内存占用,让你能够干净地集合 Windows 应用到你的桌面。
Machoview 2.4 obaby’s branch source code
增加以下内容:
#define LC_VERSION_MIN_TVOS 0x2F // add by obaby
#define LC_VERSION_MIN_WATCHOS 0x30
#define LC_VERSION_MIN_TVOS 0x2F // add by obaby
#define LC_VERSION_MIN_WATCHOS 0x30
#define LC_VERSION_MIN_TVOS 0x2F // add by obaby #define LC_VERSION_MIN_WATCHOS 0x30
Machoview 2.4 M1 Version
MachOView is a visual Mach-O file browser. It provides a complete solution for exploring and in-place editing Intel and ARM binaries.
旧版本代码编译之后打开文件可能会报下面的错误:
NSWindow drag regions should only be invalidated on the Main Thread!'
这个是由于进行状态更新的逻辑没有在主线程执行,通过下面的代码修复即可:
//----------------------------------------------------------------------------
- (void)handleThreadStateChanged:(NSNotification *)notification
{
if ([notification object] == dataController)
{
NSString * threadState = [[notification userInfo] objectForKey:MVStatusUserInfoKey];
if ([threadState isEqualToString:MVStatusTaskStarted] == YES)
{
if (OSAtomicIncrement32(&threadCount) == 1)
{
[progressIndicator setUsesThreadedAnimation:YES];
[progressIndicator startAnimation:nil];
// [stopButton setHidden:NO];
dispatch_async(dispatch_get_main_queue(), ^{
[stopButton setHidden:NO];
});
}
}
else if ([threadState isEqualToString:MVStatusTaskTerminated] == YES)
{
if (OSAtomicDecrement32(&threadCount) == 0)
{
[progressIndicator stopAnimation:nil];
[statusText setStringValue:@""];
dispatch_async(dispatch_get_main_queue(), ^{
[stopButton setHidden:YES];
});
// [stopButton setHidden:YES];
}
}
}
}
//----------------------------------------------------------------------------
- (void)handleThreadStateChanged:(NSNotification *)notification
{
if ([notification object] == dataController)
{
NSString * threadState = [[notification userInfo] objectForKey:MVStatusUserInfoKey];
if ([threadState isEqualToString:MVStatusTaskStarted] == YES)
{
if (OSAtomicIncrement32(&threadCount) == 1)
{
[progressIndicator setUsesThreadedAnimation:YES];
[progressIndicator startAnimation:nil];
// [stopButton setHidden:NO];
dispatch_async(dispatch_get_main_queue(), ^{
[stopButton setHidden:NO];
});
}
}
else if ([threadState isEqualToString:MVStatusTaskTerminated] == YES)
{
if (OSAtomicDecrement32(&threadCount) == 0)
{
[progressIndicator stopAnimation:nil];
[statusText setStringValue:@""];
dispatch_async(dispatch_get_main_queue(), ^{
[stopButton setHidden:YES];
});
// [stopButton setHidden:YES];
}
}
}
}
//---------------------------------------------------------------------------- - (void)handleThreadStateChanged:(NSNotification *)notification { if ([notification object] == dataController) { NSString * threadState = [[notification userInfo] objectForKey:MVStatusUserInfoKey]; if ([threadState isEqualToString:MVStatusTaskStarted] == YES) { if (OSAtomicIncrement32(&threadCount) == 1) { [progressIndicator setUsesThreadedAnimation:YES]; [progressIndicator startAnimation:nil]; // [stopButton setHidden:NO]; dispatch_async(dispatch_get_main_queue(), ^{ [stopButton setHidden:NO]; }); } } else if ([threadState isEqualToString:MVStatusTaskTerminated] == YES) { if (OSAtomicDecrement32(&threadCount) == 0) { [progressIndicator stopAnimation:nil]; [statusText setStringValue:@""]; dispatch_async(dispatch_get_main_queue(), ^{ [stopButton setHidden:YES]; }); // [stopButton setHidden:YES]; } } } }