我有一个在Windows 2003,Windows 2008和Windows小型企业服务器上运行的应用程序。
我有一个Windows调用来重启系统。下面提到的所有调用来自advapi32.dll
InitiateSystemshutdown - 在Windows 2003和Windows 2008中这很好,但出于某些原因无法在Windows极光中工作
InitiateShutdown - 由于上述调用在Windows极光中不起作用,我们使用此调用,此调用支持的最低操作系统是Windows 2008
现在我的应用程序无法在Windows 2003中运行,因为Windows 2003上的advapi32.dll中没有InitiateShutDown
我在advapi32.dll
中找不到Initiateshutdown的程序入口点我已经设置了一个条件,以便相对于windows版本调用正确的函数调用。
当应用程序启动时,有没有办法停止在dll中查找入口点。条件将确保调用正确的函数调用?
OR
我应该问微软为什么旧的呼叫InitiateSystemshutdown无法正常工作?
答案 0 :(得分:2)
您必须使用GetProcAddress并为早期版本的Windows设置预处理器变量。见http://msdn.microsoft.com/en-us/library/aa383745(VS.85).aspx#setting_winver_or__win32_winnt
基本上,你应该:
将WINVER设置为您必须支持的最早版本的Windows,这样您就不会意外地使用更新的东西。
在您的代码中,某些API调用和定义将不再起作用(例如您的情况下为InitiateShutdown),因为头文件不包含它们。对于这些,您必须动态使用它们。通常,您使用GetProcAddress API并使用“typedef”来定义函数的签名(因为它不在您已包含的头文件中)。这里有一个例子:http://msdn.microsoft.com/en-us/library/ms683212(VS.85).aspx。在您的情况下,您将使用InitiateShutdown API而不是给定的GetNativeSystemInfo。如果对GetProcAddress的调用失败,那么您可以认为该版本的Windows不支持该API。
答案 1 :(得分:1)
而是显式在您的代码中调用该函数(如果无法从预期的DLL加载您的应用程序将无法加载),请通过LoadLibrary和GetProcAddress隐式调用它。
在advapi32.dll上执行“LoadLibrary”。然后为“InitiateShutdown”调用GetProcAddress。如果函数不存在则优雅地失败,否则将其强制转换为适当的函数指针 调用它。
typedef DWORD (WINAPI *InitiateSystemShutdownTypeA) (char*, char*, DWORD, DWORD, DWORD);
typedef DWORD (WINAPI *InitiateSystemShutdownTypeW) (wchar_t*, wchar_t*, DWORD, DWORD, DWORD);
InitiateShutdownTypeA func = NULL;
HMODULE hMod = LoadLibrary("advapi32.dll");
if (hMod)
func = (InitiateShutdownTypeA)GetProcAddress("InitiateShutdownW");
if (func)
func(pwszMachineName, pwszMessage, dwGracePeriod, dwFlags, dwReason);