首页
社区
课程
招聘
[求助]请教如何把动态调用转为静态调用
发表于: 2012-11-23 11:27 3732

[求助]请教如何把动态调用转为静态调用

2012-11-23 11:27
3732
大家好,我是菜鸟,事情是这样的,我编写windows rt( windows8 arm版)的程序,windows rt上微软不直接提供win32 api调用接口,
1.我用vs2012的cl.exe编译arm版的win32控制台程序,写一个cout helloworld没问题,但包含windows.h调用MessageBoxA函数,提示无法解析的外部符号 __imp_MessageBoxA,这种情况是不是因为arm版的lib文件没有提供MessageBoxA的信息?这这种调用方式是不是称为静态调用?
2.老外找到了一个迂回的方法动态调用:
t_LLA* LoadLibraryA=0;
t_GPA* GetProcAddressA=0;
t_MBA* MessageBoxA=0;
t_CPA *CreateProcessA=0;

void DoThings()
{
        char *Tmp=(char*)GetTickCount64;
        Tmp=(char*)((~0xFFF)&(DWORD_PTR)Tmp);

        while(Tmp)
        {
                __try
                {
                        if(Tmp[0]=='M' && Tmp[1]=='Z')
                                break;
                } __except(EXCEPTION_EXECUTE_HANDLER)
                {
                }
                Tmp-=0x1000;
        }

        if(Tmp==0)
                return;

        LoadLibraryA=(t_LLA*)PeGetProcAddressA(Tmp,"LoadLibraryA");
        GetProcAddressA=(t_GPA*)PeGetProcAddressA(Tmp,"GetProcAddress");
        CreateProcessA=(t_CPA*)PeGetProcAddressA(Tmp,"CreateProcessA");

        HMODULE hUser=LoadLibraryA("user32.dll");
        MessageBoxA=(t_MBA*)GetProcAddressA(hUser,"MessageBoxA");
        MessageBoxA(0,"A native MessageBox!","Test",MB_OK);

       
}
通过这种方法可以动态调用MessageBox,我想问一下在这个基础上,有没有办法自己做个lib,让我以后可以直接用MessageBox而不要每个程序都用上述方法来调用MessageBox

windows rt上感觉回到了解放前,已知的函数都不能直接调用,更别说那些隐藏函数了,但这些,是看雪大牛的强项,呵呵。

另外希望大牛能帮忙用上面的方法写一个建立win32窗体的例子,上面只要有个按钮就行了,也就是说没有资源文件,动态获得CreateWindow的地址,然后画一个按钮上去

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (1)
雪    币: 952
活跃值: (1821)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
可以的 有很多工具可以从dll生成lib
2012-11-23 16:09
0
游客
登录 | 注册 方可回帖
返回
//