停止在DLL中查找运行时的入口点

时间:2011-08-22 18:32:34

标签: windows winapi function-calls

我有一个在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无法正常工作?

2 个答案:

答案 0 :(得分:2)

您必须使用GetProcAddress并为早期版本的Windows设置预处理器变量。见http://msdn.microsoft.com/en-us/library/aa383745(VS.85).aspx#setting_winver_or__win32_winnt

基本上,你应该:

  1. 将WINVER设置为您必须支持的最早版本的Windows,这样您就不会意外地使用更新的东西。

  2. 在您的代码中,某些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);