64- и 32-битные окна системных каталогов - PullRequest
1 голос
/ 02 августа 2010

Попытка найти третью проблему в базе данных без удачи.

Итак, я занимаюсь разработкой 64-битной системы (Windows 7). Я делаю простую консольную программу, которая проверяет наличие DLL в системе Windows. в этом случае я проверяю в папке system32, а затем в папке sysWOW64. Программа - 32-битное приложение.

На 32-битной целевой платформе я обычно могу проверить win32dll, так как каталог SysWOW64 не существует, никаких проблем. Бит, когда он выполняется в 64-битной системе, я могу проверить каталог win32, но каталог sysWOW64 всегда указывает на каталог system32.

Похоже, что в 64-битной системе происходит перенаправление.

Я пытаюсь использовать «Wow64DisableWow64FsRedirection», но у меня появляется «ошибка C3861:« Wow64DisableWow64FsRedirection »: идентификатор не найден» при компиляции.

Итак, есть два вопроса:

  • В winbase.h эта функция отключена, как заставить ее работать?
  • Как определить, находится ли я в данный момент в 32- или 64-битной системе во время работы программы?

Ответы [ 3 ]

2 голосов
/ 02 августа 2010

Вам не нужно искать библиотеки DLL. LoadLibrary () и LoadLibraryEx () автоматически найдут все соответствующие папки для вас.

Порядок поиска выглядит следующим образом:

  1. Каталог, из которого загружено приложение.
  2. Системный каталог.
  3. 16-битный системный каталог.
  4. Каталог Windows
  5. Текущий каталог.
  6. Каталоги, перечисленные в переменной среды PATH.

Если вы уверены, что хотите отключить перенаправление, вы можете сделать это с помощью Wow64DisableWow64FsRedirection, как вы упомянули. Чтобы это работало, нужно установить

#define _WIN32_WINNT 0x0501 (or higher)

перед включением windows.h

0 голосов
/ 02 августа 2010

Хотя это и не то, что вы ищете, немного расточительно, если вы знаете, что это единственные два места, где файл может находиться, и, возможно, не будет работать, если пользователь их изменил (хотя целый ряд других вещейбудет нарушен и для пользователя), вы можете просто использовать переменную окружения %Path%.

0 голосов
/ 02 августа 2010

О том, как определить, нахожусь ли я в настоящее время в 32 или 64-битной системе, я думаю, что вы можете проверить размер указателя int ...

int bits = IntPtr.Size * 8;
Console.WriteLine( "{0}-bit", bits );
...