我想为枚举指定64位的枚举大小.这怎么可能通过海湾合作委员会?代码不需要是"可移植的",因为我只对将代码用于x86-32和x86-64 Linux的GCC编译感兴趣.这意味着任何可以提供我想要的功能的黑客都可以,只要它适用于那些目标.
鉴于此代码:
#include <stdlib.h>
#include <stdio.h>
enum some_enum
{
garbage1,
garbage2
};
int main(void)
{
enum some_enum some_val;
printf("size: %lu\n", sizeof(some_val));
return EXIT_SUCCESS;
}
Run Code Online (Sandbox Code Playgroud)
这当前打印出4,而我希望能够强制大小为8.尝试在枚举赋值中指定大于4个字节的值会导致警告.例如,
enum some_enum
{
garbage1 = '12345',
garbage2
};
Run Code Online (Sandbox Code Playgroud)
会产生:
warning: character constant too long for its type [enabled by default]
Run Code Online (Sandbox Code Playgroud)
这里对类似问题的回答似乎没有产生任何好结果.也就是说,由于以下原因产生了相同的警告:
enum some_enum
{
garbage1 = 'adfs',
garbage2 = 'asdfasdf'
};
Run Code Online (Sandbox Code Playgroud)
注意:可以通过编译来关闭多字符警告-Wno-multichar.
由于人们对我为什么这样做感兴趣,我编写了一个反汇编引擎.我将指令的每个部分都作为字符串.所以我希望枚举看起来像这样:
enum mnemonic
{
mov = 'mov',
cmp = 'cmp',
sysenter = 'sysenter'
};
Run Code Online (Sandbox Code Playgroud)
然后,我可以使用以下代码轻松存储语义信息:
enum mnemonic …Run Code Online (Sandbox Code Playgroud) 在UIDocumentInteractionController似乎有麻烦特别是在横向的新的iOS 7的状态栏正确交互.我现在用于显示查看器的代码:
- (void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
NSString *filePath = [[NSBundle mainBundle] pathForResource:@"example" ofType:@"pdf"];
NSURL *url = [NSURL fileURLWithPath:filePath];
UIDocumentInteractionController *pdfViewer = [UIDocumentInteractionController interactionControllerWithURL:url];
[pdfViewer setDelegate:self];
[pdfViewer presentPreviewAnimated:YES];
}
- (UIViewController *)documentInteractionControllerViewControllerForPreview:(UIDocumentInteractionController *)controller
{
return self;
}
- (UIView *)documentInteractionControllerViewForPreview:(UIDocumentInteractionController *)controller
{
return self.view;
}
Run Code Online (Sandbox Code Playgroud)
当交互控制器首次出现时,状态栏与标题重叠.

在另一侧旋转到横向可以暂时修复该行为.

正如预期的那样,点击文档本身可以解散框架.然而,一旦再次轻敲文档以激活帧,则与第一图像一样再次发生重叠.
我试过设置documentInteractionControllerRectForPreview无济于事.
- (CGRect)documentInteractionControllerRectForPreview:(UIDocumentInteractionController *)controller
{
return CGRectMake(0, 20, self.view.bounds.size.width, self.view.bounds.size.height);
}
Run Code Online (Sandbox Code Playgroud)
我不希望在交互控制器启动时隐藏状态栏,我认为可以正确执行此操作,因为Mail应用程序行为正常并且看起来它使用的是同一个类.
为任何想要使用代码的人附加的最小示例项目:https: //hostr.co/PiluL1VSToVt
我正在尝试制作组框控件的文本颜色和背景。我正在使用对话框和 Win32。为了说明我的问题,我创建了一个项目,其中包含重现问题所需的最少代码。
如果我们拿一个对话框并把某种位图作为背景,我们可以很容易地看到分组框控件的真实色彩。默认情况下,没有任何覆盖,它看起来像这样:

我将尝试使用以下代码将文本颜色设置为白色,将文本背景设置为透明:
case WM_CTLCOLORSTATIC: {
HDC hDC = ( HDC )wParam;
SetTextColor( hDC, RGB( 255, 255, 255 ) );
SetBkMode( hDC, TRANSPARENT );
return ( INT_PTR )GetStockObject( HOLLOW_BRUSH );
}
Run Code Online (Sandbox Code Playgroud)
我通过更改清单来测试启用和不启用视觉样式的外观:
#pragma comment(linker,"\"/manifestdependency:type='win32' \
name='Microsoft.Windows.Common-Controls' version='6.0.0.0' \
processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"")
Run Code Online (Sandbox Code Playgroud)
使用视觉样式,对话框如下所示:

根据对话框的背景,背景将更改为不可接受的纯色。文字颜色也没有改变。禁用视觉样式后,对话框如下所示:

文本颜色已更改且透明度已生效,但组框的矩形显示甚至文本所在的位置。
我已将项目上传到此处,供任何有兴趣使用它进行测试的人使用。
我在这个网站上读过其他类似的问题,这似乎表明如果没有子类化或所有者绘图,这可能是不可能的。我不介意子类化,但我正在检查没有更好的方法可以先做到这一点。如果唯一的方法是子类化,我很乐意提供有关应该覆盖什么的信息(可能是 WM_PAINT)。我在网上找到了人们创建自己的组框控件的例子,但有些人似乎受到 z 顺序问题的困扰。因此,通过子类化,处理 WM_NCHITTEST 是否合适?
同样,如果我使用 SetWindowLong() 切换所有者绘制样式,然后将控件子类化以获取 WM_DRAWITEM 消息,有什么我应该注意的吗?我应该如何处理视觉样式等?
符号可以在一定的地址链接defsym如图所示这里。我的问题是,是否可以对部分进行相同的处理?也就是说,给定一些.o目标文件,是否可以指定节将被重定位到的基址?
或者,是否可以在最终链接之后重新设置部分的基础?也就是说,要更改二进制文件中某个节的地址,并使所有受重定位影响的信息(如该节中的相对分支等)都可以正确地重定位。
如果我的问题不清楚,我可以对其进行编辑并添加图像以更好地解释。
我希望将一个目标文件注入现有的二进制文件中.我尝试的方法是:
gcc/ld将可重定位目标文件与要嵌入的目标文件链接起来.鉴于来源:
#include <stdlib.h>
#include <stdio.h>
int main(void)
{
puts("main");
return EXIT_SUCCESS;
}
Run Code Online (Sandbox Code Playgroud)
我host用以下代码编译它:
gcc -Wall host.c -o host
Run Code Online (Sandbox Code Playgroud)
我使用以下命令转换为可重定位目标文件:
objcopy -B i386 -I binary -O elf64-x86-64 host host.o
Run Code Online (Sandbox Code Playgroud)
然后我尝试链接:
gcc host.o -o host
Run Code Online (Sandbox Code Playgroud)
理想情况下,这会将可重定位目标文件重新链接回二进制文件.这也有机会链接任何额外的目标文件.不幸的是,该命令给出了以下错误:
/usr/lib/gcc/x86_64-linux-gnu/4.6.1/../../../x86_64-linux-gnu/crt1.o: In function `_start':
(.text+0x20): undefined reference to `main'
collect2: ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud)
我的问题是为什么会出现这个错误,我将如何正确地重新连接?
我尝试的东西是在这一点链接另一个目标文件,其中包含一个虚拟主(因为我想我以后可以手动修补入口点),但是发生的事情是新的二进制文件似乎重新定位了旧的代码.奇怪的方式与符号表完全搞砸了.
readelf 在二进制文件上产生以下内容:
mike@mike-ubuntu:~/Desktop/inject-obj$ readelf -h host
ELF Header:
Magic: 7f 45 4c 46 02 01 01 00 00 00 00 00 …Run Code Online (Sandbox Code Playgroud) 当调用WinExec运行.exe时,我得到返回值0x21.
根据MSDN,返回值大于31(0x1F)表示函数成功.
但它是什么意思的0x21,为什么它没有给我返回其他价值?
我的目的是在Win32下以编程方式将窗口的大小/高度调整为大于物理屏幕的大小.我怎样才能做到这一点?
在我的系统上,似乎给定窗口的最大大小受我的屏幕大小的限制,无论是以编程方式还是通过拖动大小调整光标手动调整大小.
我已经尝试使用SetWindowPos()和MoveWindow()编程,并且都限制了目标窗口的大小.奇怪的是我知道有些人没有这个'上限',所以我想知道这是否可能是由于某些操作系统设置(注册表).有谁知道这件事?或者也许某种方法来解决它?
//编辑:新发展
我在Windows XP和Windows 7上进行测试.我使用的显卡是NVIDIA Quadro NVS 290(256MB)和Geforce 9800GT(1GB).经过进一步调查后,看起来Windows正在拦截消息并摆弄参数.例如,如果您调用SetWindowPos来制作目标2000x2000,它将只接收上限x/y的WM_SIZE.
System V AMD64 ABI 调用约定是这样规定的:
\n\n\n\n\n寄存器
\n%rbp、%rbx和%r12通过%r15\xe2\x80\x9c 属于调用函数\n,并且被调用函数需要保留它们的值。\n 换句话说,被调用函数必须保留这些寄存器\xe2\x80其调用者的 \x99\n 值。其余寄存器\xe2\x80\x9c属于\xe2\x80\x9d到被调用的\n函数。如果调用函数想要在函数调用中保留这样的寄存器值,则它必须将该值保存在其本地堆栈帧中。
例如,给定以下代码:
\n\nvoid f1(const int i, const double j, const char * k)\n{\n printf("i = %d\\n", i);\n printf("j = %g\\n", j);\n printf("k = %s\\n", k);\n}\nRun Code Online (Sandbox Code Playgroud)\n\n装配表示为:
\n\nf1():\n 4004f4: 55 push %rbp\n 4004f5: 48 89 e5 mov %rsp,%rbp\n 4004f8: 48 83 ec 20 sub $0x20,%rsp\n 4004fc: 89 7d fc mov %edi,-0x4(%rbp)\n 4004ff: f2 0f 11 45 …Run Code Online (Sandbox Code Playgroud)