小编Mik*_*wan的帖子

如何在GCC中指定枚举大小?

我想为枚举指定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)

c enums gcc

8
推荐指数
4
解决办法
2万
查看次数

文档交互控制器与iOS 7状态栏?

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

cocoa-touch statusbar ios uidocumentinteraction ios7

6
推荐指数
1
解决办法
3760
查看次数

如何在 Win32 中为分组框控件着色?

我正在尝试制作组框控件的文本颜色和背景。我正在使用对话框和 Win32。为了说明我的问题,我创建了一个项目,其中包含重现问题所需的最少代码。

如果我们拿一个对话框并把某种位图作为背景,我们可以很容易地看到分组框控件的真实色彩。默认情况下,没有任何覆盖,它看起来像这样:

http://localhostr.com/file/ItBy6DF/no%20override.png

我将尝试使用以下代码将文本颜色设置为白色,将文本背景设置为透明:

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)

使用视觉样式,对话框如下所示:

http://localhostr.com/file/hyJOhsj/theming.png

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

http://localhostr.com/file/8nVzn7t/no%20theming.png

文本颜色已更改且透明度已生效,但组框的矩形显示甚至文本所在的位置。

我已将项目上传到此处,供任何有兴趣使用它进行测试的人使用。

我在这个网站上读过其他类似的问题,这似乎表明如果没有子类化或所有者绘图,这可能是不可能的。我不介意子类化,但我正在检查没有更好的方法可以先做到这一点。如果唯一的方法是子类化,我很乐意提供有关应该覆盖什么的信息(可能是 WM_PAINT)。我在网上找到了人们创建自己的组框控件的例子,但有些人似乎受到 z 顺序问题的困扰。因此,通过子类化,处理 WM_NCHITTEST 是否合适?

同样,如果我使用 SetWindowLong() 切换所有者绘制样式,然后将控件子类化以获取 WM_DRAWITEM 消息,有什么我应该注意的吗?我应该如何处理视觉样式等?

winapi controls dialog

5
推荐指数
1
解决办法
3552
查看次数

链接时如何为节指定基地址,或者链接后如何为节重新设置基址?

符号可以在一定的地址链接defsym如图所示这里。我的问题是,是否可以对部分进行相同的处理?也就是说,给定一些.o目标文件,是否可以指定节将被重定位到的基址?

或者,是否可以在最终链接之后重新设置部分的基础?也就是说,要更改二进制文件中某个节的地址,并使所有受重定位影响的信息(如该节中的相对分支等)都可以正确地重定位。

如果我的问题不清楚,我可以对其进行编辑并添加图像以更好地解释。

linux linker

5
推荐指数
1
解决办法
5251
查看次数

如何从二进制转换为可重定位目标文件并返回?

我希望将一个目标文件注入现有的二进制文件中.我尝试的方法是:

  • 将已编译的二进制文件转换为可重定位目标文件.
  • 用于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)

c linker gcc

5
推荐指数
1
解决办法
4197
查看次数

WinExec返回0x21,但究竟是什么意思?

当调用WinExec运行.exe时,我得到返回值0x21.
根据MSDN,返回值大于31(0x1F)表示函数成功.
但它是什么意思的0x21,为什么它没有给我返回其他价值?

windows winapi

5
推荐指数
1
解决办法
2344
查看次数

是否可以通过屏幕尺寸/屏幕外调整窗口大小?

我的目的是在Win32下以编程方式将窗口的大小/高度调整为大于物理屏幕的大小.我怎样才能做到这一点?

在我的系统上,似乎给定窗口的最大大小受我的屏幕大小的限制,无论是以编程方式还是通过拖动大小调整光标手动调整大小.

我已经尝试使用SetWindowPos()和MoveWindow()编程,并且都限制了目标窗口的大小.奇怪的是我知道有些人没有这个'上限',所以我想知道这是否可能是由于某些操作系统设置(注册表).有谁知道这件事?或者也许某种方法来解决它?

//编辑:新发展

我在Windows XP和Windows 7上进行测试.我使用的显卡是NVIDIA Quadro NVS 290(256MB)和Geforce 9800GT(1GB).经过进一步调查后,看起来Windows正在拦截消息并摆弄参数.例如,如果您调用SetWindowPos来制作目标2000x2000,它将只接收上限x/y的WM_SIZE.

windows size winapi window max

4
推荐指数
1
解决办法
4944
查看次数

如何在 x86-64 下保留参数/参数寄存器?

System V AMD64 ABI 调用约定是这样规定的:

\n\n
\n

寄存器%rbp%rbx%r12通过%r15\xe2\x80\x9c 属于调用函数\n,并且被调用函数需要保留它们的值。\n 换句话说,被调用函数必须保留这些寄存器\xe2\x80其调用者的 \x99\n 值。其余寄存器\xe2\x80\x9c属于\xe2\x80\x9d到被调用的\n函数。如果调用函数想要在函数调用中保留这样的寄存器值,则它必须将该值保存在其本地堆栈帧中。

\n
\n\n

例如,给定以下代码:

\n\n
void 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}\n
Run Code Online (Sandbox Code Playgroud)\n\n

装配表示为:

\n\n
f1():\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)

c 64-bit assembly gcc

1
推荐指数
1
解决办法
1602
查看次数