C++ InitializeCriticalSectionEx不在KERNEL32.Dll中
我正在尝试在VS2015中构建一个dll项目,以便将其部署到Windows XP上。它在Windows 7上工作,但在Windows XP SP3上出现错误: 在动态链接库KERNEL32.dll中找不到过程入口点InitializecriticalSectionEx 我用以下方法建立了图书馆:C++ InitializeCriticalSectionEx不在KERNEL32.Dll中,c++,windows,visual-studio,C++,Windows,Visual Studio,我正在尝试在VS2015中构建一个dll项目,以便将其部署到Windows XP上。它在Windows 7上工作,但在Windows XP SP3上出现错误: 在动态链接库KERNEL32.dll中找不到过程入口点InitializecriticalSectionEx 我用以下方法建立了图书馆: 配置=发布;平台=x86;平台工具集=v140_xp 不幸的是,即使安装了SP3,该函数在XP版本的Kernel32.dll中也不存在。直到Vista才推出。您使用的驱动程序似乎与XP不完全兼容 是否可
配置=发布;平台=x86;平台工具集=v140_xp代码>
不幸的是,即使安装了SP3,该函数在XP版本的Kernel32.dll中也不存在。直到Vista才推出。您使用的驱动程序似乎与XP不完全兼容
是否可以在不降级构建平台工具集的情况下解决此问题?由于需要DLL在操作系统上运行,而在操作系统上,InitializeCriticalSectionEx()
不可用,因此无法在编译时静态链接到该函数。这就是为什么会出现入口点错误
相反,您必须在运行时使用动态加载InitializeCriticalSectionEx()
函数(或者,在内部使用GetProcAddress()
)
如果InitializeCriticalSectionEx()
函数在运行时加载失败,那么您的代码可以退回到其他程序,例如,甚至。由于您需要DLL在InitializeCriticalSectionEx()
不可用的操作系统上运行,因此无法在编译时静态链接到该函数。这就是为什么会出现入口点错误
相反,您必须在运行时使用动态加载InitializeCriticalSectionEx()
函数(或者,在内部使用GetProcAddress()
)
如果InitializeCriticalSectionEx()
函数在运行时加载失败,那么您的代码可以退回到其他程序,例如甚至。您应该选择xp toolkit。这是不可解决的,因为无论您使用什么工具箱构建,Windows xp上都不存在InitializeCriticalSectionEx
。可以使用InitializeCriticalSection
或使用条件编译来构建2个DLL,以便在较旧和较新的平台上部署。@RichardCriten是的,它是可以解决的,使用动态加载而不是静态链接您应该选择xp toolkit。这是不可解决的,因为无论您使用哪个toolkit构建,Windows xp上都不存在InitializecriticalSectionEx
。可以使用InitializeCriticalSection
或使用条件编译来构建2个DLL,以便在较旧和较新的平台上部署。@RichardCriten是的,这是可以解决的,使用动态加载而不是静态链接代替调用InitializeCriticalSection作为备用方法,他可以调用InitializeCriticalSection和SpinCount。如果需要的话,它至少允许设置旋转计数。@dummzeuch谢谢,我更新了我的回答,而不是调用InitializeCriticalSection作为后备,他可以调用InitializeCriticalSection和旋转计数。如果需要,它至少允许设置旋转计数。@dummzeuch谢谢,我更新了我的答案