我正在阅读关于自修改代码的密码破解者期刊文章,并且有以下代码片段:
void Demo(int (*_printf) (const char *,...))
{
_printf("Hello, OSIX!n");
return;
}
int main(int argc, char* argv[])
{
char buff[1000];
int (*_printf) (const char *,...);
int (*_main) (int, char **);
void (*_Demo) (int (*) (const char *,...));
_printf=printf;
int func_len = (unsigned int) _main - (unsigned int) _Demo;
for (int a=0; a<func_len; a++)
buff[a] = ((char *) _Demo)[a];
_Demo = (void (*) (int (*) (const char *,...))) &buff[0];
_Demo(_printf);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这段代码应该在堆栈上执行Demo().我理解大部分代码,但是他们分配'func_len'的部分让我困惑.据我所知,他们从另一个随机指针地址中减去一个随机指针地址.
有人在意解释?
因此,如果字符串有空格,或者如果我在字符串的末尾放入\ r \n,我可以使drawtext断开字符串.但是,一个没有空格或换行符的长字符串会继续经过绘图矩形并被剪裁.如果可能的话,我想防止这种情况发生.
drawtext的格式标志中没有任何内容能够突显我的意义.有任何想法吗?
我有一个包含多个自定义控件的程序。这些自定义控件之一是文本输入控件。由于窗口在您单击时不会自动接收键盘焦点,因此我在我的程序中创建了一个鼠标钩子,当用户在该窗口中单击时,该钩子会在该窗口上调用 SetFocus()。但是,有一个问题。
如果单击我的程序窗口(或该窗口中的任何控件)时另一个程序具有焦点,则 SetFocus() 失败。然后我必须再次单击它才能成功。这是代码:
LRESULT CALLBACK kbfProc(int nCode, WPARAM wParam, LPARAM lParam) // Keyboard focus switching procedure
{
switch(nCode)
{
case HC_ACTION:
{
if(wParam == WM_LBUTTONDOWN || wParam == WM_NCLBUTTONDOWN)
{
MOUSEHOOKSTRUCT * mhs = (MOUSEHOOKSTRUCT*) lParam;
if(SetFocus(mhs->hwnd) == NULL)
{
printf("SetFocus(Hwnd = %.8x) failed. Error code: %lu\n", mhs->hwnd, GetLastError());
} else {
printf("SetFocus(Hwnd = %.8x) returned success.\n", mhs->hwnd);
}
}
}
break;
}
return CallNextHookEx(0, nCode, wParam, lParam);
}
Run Code Online (Sandbox Code Playgroud)
这些 printf 调用的输出是这样的:
SetFocus(Hwnd = 00410c06) failed. Error code: …Run Code Online (Sandbox Code Playgroud)