QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 1400|回复: 13

晦涩的语法问题?

[复制链接]
发表于 2005-6-15 10:20:54 | 显示全部楼层 |阅读模式
[code:1]
WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
try
{
DWORD dwVersion = GetVersion(); //取得Windows的版本号
if (dwVersion >= 0x80000000) // Windows 9x隐藏任务列表
{
int (CALLBACK *rsp)(DWORD,DWORD);
HINSTANCE dll=LoadLibrary("KERNEL32.DLL"); //装入KERNEL32.D
LL
rsp=(int(CALLBACK *)(DWORD,DWORD))GetProcAddress(dll,"Regist
erServiceProcess"); //找到RegisterServiceProcess的入口
rsp(NULL,1); //注册服务
FreeLibrary(dll); //释放DLL模块
}
}
其中的rsp=(int(CALLBACK *)(DWORD,DWORD))GetProcAddress(dll,"RegisterServiceProcess");在语法上搞不懂 ?[/code:1]
发表于 2005-6-15 10:42:13 | 显示全部楼层
其中rsp是一个指向函数入口地址的指针。(这个函数的要求是输入参数为WORD,WORD,返回参数为int。
GetProceAddress这个WindowsAPI函数返回的是一个函数的地址,前面加上int(CALLBACK *)(DWORD,DWORD)表示强制转化为rsp的类型,然后赋给rsp。

看来这位朋友“居心不良”
回复

使用道具 举报

 楼主| 发表于 2005-6-15 10:48:44 | 显示全部楼层
谢谢.
只是研究研究,没有什么居心.     
回复

使用道具 举报

发表于 2005-6-15 10:51:42 | 显示全部楼层
有些东西只是在一些特殊的地方用用(如病毒)。
正常情况下没有必要这么拐弯抹角。
回复

使用道具 举报

 楼主| 发表于 2005-6-15 10:55:53 | 显示全部楼层
再问一个,问题在代码的注释部分.
[code:1]
int main(int argv,char **argc) {
extern system,puts;
void (*fn)(char*)=(void(*)(char*))&system;  //&符号是什么意思?
char buf[256];

fn=(void(*)(char*))&puts;
strcpy(buf,argc[1]);
fn(argc[2]);  //fn是个函数指针吧,这一句是不是一个函数调用?如果是前面不用加*符号吗?
exit(1);
}
[/code:1]
回复

使用道具 举报

发表于 2005-6-15 11:07:52 | 显示全部楼层
&表示取地址。
用不用加*我不大记得了,映象中好像应该写成 *fn(...); (前面rsp也没有加*,是不是也有问题?)
你试试看,我手边没有编译工具。
回复

使用道具 举报

发表于 2005-6-15 11:13:11 | 显示全部楼层
system 本身是函数的入口地址。&system 为存放函数入口地址的地址。
照这么想应该写成*fn(...);
回复

使用道具 举报

 楼主| 发表于 2005-6-15 16:16:35 | 显示全部楼层
真是不巧,我手边也没有编译器.
回复

使用道具 举报

发表于 2005-6-15 19:01:51 | 显示全部楼层
(int(CALLBACK *)(DWORD,DWORD))GetProcAddress(dll,"Regist
erServiceProcess");
出于可理解的考虑,应该分开写:
[code:1]typedef int(CALLBACK * fp_t)(DWORD,DWORD);
rsp = (fp_t)GetProcAddress(dll,"RegisterServiceProcess")[/code:1]

后一个问题:普通函数指针可以不经过解引用直接调用,这是 C 的语法规定的。
回复

使用道具 举报

 楼主| 发表于 2005-6-15 21:26:49 | 显示全部楼层
就是说后一个问题中如果解引用和不解引用效果是一样的了?
回复

使用道具 举报

 楼主| 发表于 2005-6-16 10:08:33 | 显示全部楼层
void (*fn)(char*)=(void(*)(char*))&system;中的&符号加不加也是一样的吗?
回复

使用道具 举报

发表于 2005-6-16 21:23:08 | 显示全部楼层
void (*pf)(void);

void func(void);

pf=func;

然后
(*pf)();
pf();
它们的结果是一样的, 都是执行了func();
回复

使用道具 举报

发表于 2005-6-17 14:41:25 | 显示全部楼层
两点:
1.在把一个函数名称赋给一个函数指针时可以不加&,也可以加的
2.在对一个函数指针解引用操作时,可以加*,也可以不加的
其实理解的时候可以认为上面两个刚好是一一对应的,是吧?不过实际使用的时候不需要对应。
回复

使用道具 举报

发表于 2005-6-20 09:25:32 | 显示全部楼层
微软没msdn了?来这讨论微软的东西干啥?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2024-11-5 19:41 , Processed in 0.050818 second(s), 16 queries .

© 2021 Powered by Discuz! X3.5.

快速回复 返回顶部 返回列表