USER32.dll中缺少入口点会阻止程序启动,C ++,VS2015

时间:2016-11-01 17:45:45

标签: c++ dll visual-studio-2015

我正在Windows 10计算机上使用 VS2015 (Platform Toolset v140,Target Platform 8.1)编写C ++程序,我的程序在Windows 7,8和10上运行得很好,直到最近

使用GetPointerInfo()添加触控支持后,我在Windows 7计算机上执行时立即收到此弹出错误:

  

无法在USER32.dll中找到名为GetPointerInfo的入口点

MS明确指出Fruit = "lemon","pineapple","kiwi","banana","watermelon" Mobile = "motorola","apple","nokia","samsung","oppo" Furniture = "table","sofa","wardrobe","chair","bed" AllWords = Fruit + Mobile + Furniture ... secret = getRandomword(AllWords) 仅在Win8及更高版本上受支持,而且没关系,但我不想破坏我的程序与Windows 7的兼容性。

我假设Windows 7的GetPointerInfo()版本根本不包含该函数,但在我的程序中添加了运行时检查(即,如果USER32.DLL返回true,则仅调用GetPointerInfo())做的伎俩。

事实上,仅仅使用对IsWindows8OrGreater()的任何引用来编译我的程序都会破坏Win7的兼容性,无论该函数是否实际被调用。该程序甚至不会输入GetPointerInfo(),它只会抛出该消息并退出。

同样,在Windows 8及更高版本中,一切正常。

我该如何解决这个问题?

我已经谷歌搜索了半天,但对DLL,链接器和编译器设置知之甚少,我显然甚至不知道如何对我的搜索进行短语,因为到目前为止我已经空了。

我已尝试使用多线程(/ MT)和多线程DLL(/ MD)作为我的运行时库。

我也尝试过启用和禁用功能级链接,但结果保持不变。

2 个答案:

答案 0 :(得分:2)

  

我认为Windows 7版本的USER32.dll根本不包含该功能

这是正确的。

  

但在我的程序中添加运行时检查(即只在IsWindows8OrGreater上调用GetPointerInfo)并不起作用。 :(

如果您在运行时动态加载函数,可以使用链接器的delay-loading feature,也可以直接在代码中使用GetProcAddress()(链接器的延迟加载器在内部使用GetProcAddress() )。

  

事实上,仅仅通过对GetPointerInfo的任何引用来编译我的程序都会破坏Win7兼容性,无论是否实际调用了函数。

只有在编译时静态链接到函数而不使用链接器的延迟加载功能时才会发生该错误。

答案 1 :(得分:0)

非常感谢。

GetProcAddress()对我来说是一个很棒的方法。 我遇到了同样的问题。 而且我引用了this website about using GetProcAddress()

1。写一些定义

typedef BOOL(WINAPI *GetPointerInfoProc)(UINT32,POINTER_INFO *);

2。延迟加载库

HMODULE hModule = LoadLibrary(TEXT("user32.dll")); GetPointerInfoProc GetPointerInfo = (GetPointerInfoProc )GetProcAddress(hModule, "GetPointerInfo");

3.call方法

GetPointerInfo(pointerId,&pointerInfo)