Я могу загрузить DLL на 32 бита в процесс на 64 бита в Windows?

Вы можете использовать регулярное выражение (RegEx) в методе String.matches () для определения, содержит ли строка конкретные критерии, например:

[110 ]

Если вы хотите получить полное объяснение этого регулярного выражения, перейдите на rexex101.com и введите следующее выражение: .*\*.*\*.*|.*\%.*\%.*.

Вышеупомянутое условие оператора if использует метод String.matches () , чтобы проверить, содержит ли строка текст (или нет текст) между звездочками (*) или между процентов (%) символов. Если это так, мы просто используем метод String.replaceAll () , чтобы заменить эти строковые секции (между *...* и %...% включительно) значением 1, примерно так:

[ 111]

В окне консоли будет отображаться:

hello! hello!! 1? Yes I can.

Если вы сыграете эту строку: "*Java is awesome* Do you % agree % with us?" с приведенным выше кодом, в вашем окне консоли будет отображаться:

1 Do you 1 with us?

[1120 ] Имейте в виду, что это обеспечит тот же вывод на консоль, если указанная вами строка была "** Do you %% with us?". Если вы на самом деле этого не хотите, вам нужно изменить RegEx в методе match () чуть-чуть на что-то вроде этого:

".*\\*.+\\*.*|.*\\%.+\\%.*"

, и вам нужно будет измените RegEx в методе replaceAll () следующим образом:

"\\*.+\\*|%.+%"

С этим изменением теперь должен быть текст между звездочками и символами процента, прежде чем проверка будет успешной и изменение сделано.

34
задан Lee 22 October 2008 в 10:25
поделиться

2 ответа

Нет, Вы не можете.

И 16-разрядный и 32-разрядный Windows жил в 32-разрядном линейном адресном пространстве. Термины 16 и 32 относятся к размеру смещения относительно селектора.

...

Первый, заметьте, что полноразмерный 16-разрядный указатель и 32-разрядный плоский указатель являются тем же размером. Значение 0x0123:0x467 требует 32 битов, и ничего себе, так также делает 32-разрядный указатель. Это означает, что структуры данных, содержащие указатели, не изменяют размер между своими 16-разрядными и 32-разрядными дубликатами. Очень удобное совпадение.

Ни одно из этих двух наблюдений не сохраняется для 32-разрядного к 64-разрядному преобразованию. Размер указателя изменился, что означает, что преобразование 32-разрядной структуры к 64-разрядной структуре и наоборот изменяет размер структуры . И 64-разрядное адресное пространство в четыре миллиарда раз больше, чем 32-разрядное адресное пространство. Если будет некоторая память в 64-разрядном адресном пространстве при смещении 0x000006fb '01234567, то 32-битный код будет не мочь получить доступ к нему. Это не похоже на Вас, может создать окно временного адреса, потому что 32-разрядный плоский код не знает об этих окнах временного адреса; они отказались от селекторов, помните?

http://blogs.msdn.com/oldnewthing/archive/2008/10/20/9006720.aspx

26
ответ дан 27 November 2019 в 17:12
поделиться

Если Ваше приложение.NET является веб-сайтом, работающим в IIS, можно обойти его.

Веб-страница ASP.NET, работающая на IIS на 64-разрядной машине, будет размещена 64-разрядной версией процесса w3wp.exe, и если Ваша веб-страница будет использовать 32-разрядный dlls, то Ваш сайт перестанет работать.

Однако в IIS можно войти в Расширенные настройки Пула приложений, выполняющего сайт, и измениться, "Включают 32-разрядные приложения" к истинному.

Таким образом, это все еще не может выполнить 32-разрядный dll в 64-разрядном процессе, а скорее это выполняет w3wp.exe как 32-разрядный процесс вместо этого.

6
ответ дан 27 November 2019 в 17:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: