【API】如何动态调用API?CallWindowProc?

Defanive 2010-06-26 07:33:38
动态调用,就是说事先不知道要调用某个API,是在运行过程中动态的执行这个API

例如如何动态调用MessageBeep(0)?又如何动态调用MessageBox(NULL,"123","456",MB_OK)?

之前在VB里面看到用CallWindowProc动态调用API的,但是我用VC怎么不行?

这个是VB的代码:
http://topic.csdn.net/u/20080928/15/287c677b-69e6-432e-9f77-ee58b3fa619f.html
...全文
548 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
Defanive 2010-07-09
  • 打赏
  • 举报
回复
这么久没人回答我的问题,我表示鸭梨很大。。。
bxbian951122 2010-07-08
  • 打赏
  • 举报
回复
顶。。= =
Defanive 2010-06-30
  • 打赏
  • 举报
回复
顶起啊,各位帮帮忙
Defanive 2010-06-30
  • 打赏
  • 举报
回复
继续顶起,持续关注
Defanive 2010-06-29
  • 打赏
  • 举报
回复
对啊,VB和VC没啥区别吧,VB还要稍弱,怎么可能VC做不到呢?
sunlin7 2010-06-29
  • 打赏
  • 举报
回复
简单几句VC代码肯定是不行的.----vb里面参数有类型特征,而且要么是值,要么是引用,可以方便.但C++里面还可能是结构.

除非限定函数只接受短于或者等寄存器长度的参数,才可以改写.

需要实现api的"动态调用"(楼主的意思是,希望可以实现解释语句)Herbert Schildt的the art of C++书中的mini C++解释程序.
jasonM2008 2010-06-29
  • 打赏
  • 举报
回复
大概看了下,你发的那个链接的代码。。但是MS不是解释脚本,根动态载入DLL 然后用GetProcAddress取函数地址。然后调用类似哦!
jasonM2008 2010-06-29
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 defanive 的回复:]

2L,不是这个意思啊
你看看VB那代码,大概的意思就是给出一个字串符"MessageBeep 0",就能执行这个API

这肯定能做到的吧,VB都能做到,VC绝对可以把
[/Quote]
你是在写脚本解释程序吧。。VC 恐怕要自己实现这个功能哦!!!!
weblai 2010-06-28
  • 打赏
  • 举报
回复
原理这是2楼的,但vc一般不用这样说,除非是一些ms未公开的api.
fs822 2010-06-28
  • 打赏
  • 举报
回复
帮忙顶

Loadlibrary?
bxbian951122 2010-06-28
  • 打赏
  • 举报
回复
同问。。顶。。。
Defanive 2010-06-27
  • 打赏
  • 举报
回复
顶起。。。
Defanive 2010-06-27
  • 打赏
  • 举报
回复
复制错了,最后的CallWndProc应该是
CallWndProc(lngStart,0,0,0,0);
Defanive 2010-06-27
  • 打赏
  • 举报
回复
怎么就不能按照VB的脚本写一份呢?
这是我按照VB的运行思路写的调用MessageBoxA,但是运行老有问题,大家看看:

// APIEx.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <windows.h>
#include <stdio.h>

typedef LRESULT (WINAPI *CWProc)(long,HWND,UINT,WPARAM,LPARAM);
CWProc CallWndProc;
int i;
byte Data[424];

void AddByte(int byt)
{
memcpy(&Data[i],&byt,1);
i++;
}

void AddLong(long lng)
{
memcpy(&Data[i],&lng,4);
i+=4;
}

int main(int argc, char* argv[])
{
long Proc;
long lngStart;
long ps1;
long ps2;
char s1[]="hello";
char s2[]="caption";
Proc=(long)GetProcAddress(LoadLibrary("user32.dll"),"MessageBoxA");
lngStart=((long)&Data|0x0F)+1;
for(int k=0;k<(lngStart-(long)&Data);k++)
{
AddByte(0xCC);
}
ps1=(long)&s1[0];
ps2=(long)&s2[0];
AddByte(0x68);
AddLong(0x00);
AddByte(0x68);
AddLong(ps1);
AddByte(0x68);
AddLong(ps2);
AddByte(0x68);
AddLong(0x00);
AddByte(0xE8);
printf("%d\n",i-(lngStart-(long)&Data));
AddLong(Proc-(long)&Data[i]-4);
AddByte(0xC2);
AddByte(0x10);
AddByte(0x00);
CallWndProc=(CWProc)GetProcAddress(LoadLibrary("user32.dll"),"CallWindowProc");
printf("Data:%d\nlngStart:%d\nFuncProc:%d\n",(long)&Data,lngStart,Proc);
system("pause");
long x=(long)GetProcAddress(LoadLibrary("user32.dll"),"GetForegroundWindow");
printf("%d\n",x);
CallWndProc(x,0,0,0,0);
return 0;
}
shuice 2010-06-26
  • 打赏
  • 举报
回复
rundll32.exe 后面可以接好多参数,然后它把参数传递给要调用的API,不过这个API的参数是有限制的,可以搜索在rundll32.exe ,至于Messagebox是无法实现的,可以在mSDN里面搜索PassportWizardRunDll来看看例子

C++脚本编程也不错哦,不过我没有试验过
Defanive 2010-06-26
  • 打赏
  • 举报
回复
但是在VB6里面用CallWindowProc也的确实现了动态调用API啊
同样的原理,换个语言不至于就不行了吧
chehw 2010-06-26
  • 打赏
  • 举报
回复
CallWindowProc不是用来“动态调用API”,而是窗口子类化时用的。

如果“动态调用”指的是程序运行时根据输入的字符串执行对应的API,
简单一点的可以用
if(0==lstrcmp(strInput,szAPI_01)){...}
else if(0==lstrcmp(strInput,szAPI_01)){...}
复杂一点的可以先学习一下编译原理,再写一个脚本解释器。
DontKissBossAss 2010-06-26
  • 打赏
  • 举报
回复
VC也能,loadlibrary();
然后要输入一个函数名字,输入参数,然后getaddress()得到函数指针,执行。。。。
Defanive 2010-06-26
  • 打赏
  • 举报
回复
对,我就是这么想,然后我用VC把那个VB代码重新写了一次,结果运行出错。。。
貌似是我的CallWindowProc动态载入有问题,就算直接运行CallWindowProc(0,0,0,0)程序都崩掉。。。
WaistCoat09 2010-06-26
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 defanive 的回复:]

2L,不是这个意思啊
你看看VB那代码,大概的意思就是给出一个字串符"MessageBeep 0",就能执行这个API

这肯定能做到的吧,VB都能做到,VC绝对可以把
[/Quote]

原理是一样的,VC就是这么实现,那个VB代码可以用VC实现的。
加载更多回复(5)

16,467

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧