我想以这样的方式调用MessageBox()函数:
1)。装载所需的库
2)。得到功能地址
3)。叫它
因此,对于我理解的目标,我应该在MessageBox函数中定义具有所有类型参数的新类型。
它返回INT并接受:HWND,LPCSTR,LPCSTR,UNIT。
所以我注册了新类型:
typedef int(__stdcall *msgbox)(HWND, LPCSTR, LPCSTR, UINT);
我在调用此类函数时遇到问题。这种方式适用于所有功能还是仅用于导出?
如何以这种方式完全调用MessageBox?
完整代码:
#include <iostream>
#include <windows.h>
using namespace std;
typedef int(__stdcall *msgbox)(HWND, LPCSTR, LPCSTR, UINT);
int main(void)
{
HINSTANCE__ *hModule = LoadLibrary(L"\\Windows\\System32\\User32.dll");
msgbox *me = 0;
if(hModule != 0)
{
me = (msgbox*)GetProcAddress(hModule, "MessageBox");
}
return 0;
}
谢谢,
最诚挚的问候!
答案 0 :(得分:4)
你为什么宣称一切都是指针?
LoadLibrary
会返回HMODULE
,而不是HINSTANCE__ *
(它会与后者一起使用,但最好遵守文档)。
同样,msgbox
typedef
是函数指针类型,因此me
是msgbox
,而不是msgbox *
。
GetProcAddress
失败的原因是因为user32.dll导出了2个函数,MessageBoxA
和MessageBoxW
。当您只是在代码中调用MessageBox
时,Windows.h中定义的宏将替换为2个实际函数名称之一,具体取决于您是否正在编译UNICODE
。但是,当您尝试直接访问导出的函数时,您需要明确指定您尝试获取指针的那个。
#include <iostream>
#include <windows.h>
typedef int(__stdcall *msgbox)(HWND, LPCSTR, LPCSTR, UINT);
int main(void)
{
HMODULE hModule = ::LoadLibrary(L"User32.dll");
msgbox me = NULL;
if( hModule != NULL ) {
me = reinterpret_cast<msgbox>( ::GetProcAddress(hModule, "MessageBoxA") );
}
if( me != NULL ) {
(*me)( NULL, "I'm a MessageBox", "Hello", MB_OK );
}
if( hModule != NULL ) {
::FreeLibrary( hModule );
}
}