大家好,我是菜鸟,事情是这样的,我编写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的地址,然后画一个按钮上去
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!