Хватит искать точку входа во время выполнения в DLL - PullRequest
0 голосов
/ 22 августа 2011

У меня есть приложение, которое запускается на Windows 2003, Windows 2008 и Windows Small Business Server.

Я вызываю Windows для перезагрузки системы. Все упомянутые ниже вызовы поступают из advapi32.dll.

InitiateSystemshutdown - Это нормально в Windows 2003 и Windows 2008, но по какой-то причине не работает в Windows Aurora

InitiateShutdown - поскольку вышеупомянутый вызов не работает в Windows Aurora, мы использовали этот вызов и минимумдля этого вызова поддерживается ОС Windows 2008

. Теперь мое приложение не запускается в Windows 2003, так как InitiateShutDown отсутствует в advapi32.dll в Windows 2003

Мне не удается найти процедуруточка входа для Initiateshutdown в advapi32.dll

Я уже поставил условие, чтобы соответствующие вызовы функций вызывались относительно версии Windows.

Есть ли способ прекратить искатьточка входа в dll при запуске приложения. Условие будетВы уверены, что вызывается правильный вызов функции?

ИЛИ

Я должен спросить Microsoft, почему старый вызов InitiateSystemshutdown не работает должным образом?

Ответы [ 2 ]

2 голосов
/ 22 августа 2011

Вы должны использовать GetProcAddress и установить переменные препроцессора для более ранней версии Windows.См. http://msdn.microsoft.com/en-us/library/aa383745(VS.85).aspx#setting_winver_or__win32_winnt

По сути, вы должны:

  1. Установить WINVER на самую раннюю версию Windows, которую вы должны поддерживать, чтобы случайно не использовать что-то более новое.

  2. Некоторые вызовы и определения API больше не будут работать (например, InitiateShutdown) в вашем коде, поскольку они не включены в заголовочные файлы.Для этого вы должны использовать их динамически.Обычно вы используете API GetProcAddress и используете «typedef», чтобы определить сигнатуру функции (так как ее больше нет в заголовочных файлах, которые вы включаете).Вот пример: http://msdn.microsoft.com/en-us/library/ms683212(VS.85).aspx. В вашем случае вы бы использовали API InitiateShutdown вместо заданного GetNativeSystemInfo.В случае сбоя вызова GetProcAddress можно предположить, что API не поддерживается в этой версии Windows.

1 голос
/ 22 августа 2011

Вместо того, чтобы явно вызывать эту функцию в вашем коде (так что ваше приложение не сможет загрузиться, если функция не может быть загружена из ожидаемой DLL), неявно вызовите ее через LoadLibrary и GetProcAddress.

Сделайте «LoadLibrary» на advapi32.dll. А затем вызовите GetProcAddress для «InitiateShutdown». Сбой изящно, если функция не существует, в противном случае приведите ее к соответствующему указателю на функцию и вызвать его.

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);
...