|
Как понять, что код выполняется в 64-битной ОС? [2] | ☑ | ||
---|---|---|---|---|
0
TormozIT
гуру
02.09.15
✎
14:42
|
1-я попытка тут Как понять, что код выполняется в 64-битной ОС?
Там было найдено лучшее решение через WMI.Win32_OperatingSystem.OSArchitecture мWMI = КэшКонтекстаИис.ПолучитьСлужбуWMIИис(Компьютер); ИмяКласса = "Win32_OperatingSystem"; КоллекцияОС = мWMI.InstancesOf(ИмяКласса); Для каждого лОС Из КоллекцияОС Цикл Прервать; КонецЦикла; Результат = Лев(лОС.OSArchitecture, 2) = "64"; , но сегодня программу запустили на Windows 2003 Server и там не оказалось свойства OSArchitecture. Так что нужен другой более универсальный способ. |
|||
1
TormozIT
гуру
02.09.15
✎
14:42
|
Вот тут человек страдал похожей проблемой http://stackoverflow.com/questions/1413409/how-to-determine-os-platform-with-wmi
|
|||
2
z80a
02.09.15
✎
14:43
|
Program Files (x86)
|
|||
3
Маратыч
02.09.15
✎
14:45
|
(0) Помнится, еще был атрибут AddressWidth, не? Класс Win32Processor также через WMI если получить.
|
|||
4
TormozIT
гуру
02.09.15
✎
14:45
|
(2) В (1) http://stackoverflow.com/a/10738301 этот вариант имеет оценку 0 =)
|
|||
5
Маратыч
02.09.15
✎
14:45
|
+(3) Хотя хз, насколько он универсальный.
|
|||
6
TormozIT
гуру
02.09.15
✎
14:47
|
(3) Процессор может быть 64, а ОС 32
|
|||
7
Strogg
02.09.15
✎
14:49
|
(2) ну тогда и sysWOW64 )))
|
|||
8
Маратыч
02.09.15
✎
14:49
|
(6) Это режим работы процессора, в 32-разрядной системе он будет в режиме 32 работать.
|
|||
9
Маратыч
02.09.15
✎
14:50
|
(8) Ну, точнее, WMI вернет 32.
|
|||
10
TormozIT
гуру
02.09.15
✎
14:50
|
(8) (9) Ошибаешься.
|
|||
11
Маратыч
02.09.15
✎
14:54
|
(10) Technet врет, что ли? https://msdn.microsoft.com/en-us/library/aa394373(v=VS.85).aspx
|
|||
12
Маратыч
02.09.15
✎
14:55
|
+(11) AddressWidth
Data type: uint16 Access type: Read-only On a 32-bit operating system, the value is 32 and on a 64-bit operating system it is 64. This property is inherited from CIM_Processor. |
|||
13
Serginio1
02.09.15
✎
14:57
|
Environment.Is64BitProcess
|
|||
14
Маратыч
02.09.15
✎
14:58
|
(13) А вот это точно не прокатит - текущий процесс может быть и 32-разрядным в 64-разрядной ОС.
|
|||
15
Serginio1
02.09.15
✎
14:59
|
||||
16
Serginio1
02.09.15
✎
15:00
|
Тогда Environment.OSVersion
https://msdn.microsoft.com/en-us/library/system.environment.osversion.aspx |
|||
17
Serginio1
02.09.15
✎
15:02
|
||||
18
Serg_1960
02.09.15
✎
15:04
|
Хмм... а если я в 32-битной 1С сижу на 64-битной ОС? :)
|
|||
19
TormozIT
гуру
02.09.15
✎
15:06
|
(11) У меня 32битная ОС. Свойство содержит значение 64.
|
|||
20
TormozIT
гуру
02.09.15
✎
15:07
|
(16) Опять?) На 1с кода так и не показал ты
|
|||
21
Serginio1
02.09.15
✎
15:10
|
Environment.Is64BitOperatingSystem
https://msdn.microsoft.com/en-us/library/system.environment.is64bitoperatingsystem.aspx |
|||
22
TormozIT
гуру
02.09.15
✎
15:11
|
(21) Согласен, что инфа полезная, но как ее применить в 1С без создания ВК?
|
|||
23
Serginio1
02.09.15
✎
15:13
|
врап=новый COMОбъект("NetObjectToIDispatch45");
Environment=Врап.ПолучитьТип("System.Environment"); Сообщить("Is64BitOperatingSystem="+Environment.Is64BitOperatingSystem); |
|||
24
Serg_1960
02.09.15
✎
15:13
|
Дяденьки, простите дилетанта, но :)
СисИнфо = Новый СистемнаяИнформация; Сообщить(СисИнфо.ВерсияОС); Сообщить(СисИнфо.ТипПлатформы); ? О_О |
|||
25
Serginio1
02.09.15
✎
15:16
|
(24) и?
Is64BitOperatingSystem=Да version 6.1 Service Pack 1 (Build 7601) Windows x86 |
|||
26
TormozIT
гуру
02.09.15
✎
15:16
|
Маратыч, в (3) (10) (19) я был не прав про AddressWidth. Перепутал с DataWidth. Похоже этот способ подходит.
|
|||
27
Aloex
02.09.15
✎
15:16
|
(24) Это для 8.x
|
|||
28
TormozIT
гуру
02.09.15
✎
15:18
|
Победил Маратыч с ответом (3)
|
|||
29
Толич
02.09.15
✎
15:19
|
Ну варианта всего два. Или 32 или 64. Чем попытка плоха?
|
|||
30
MMF
02.09.15
✎
15:25
|
WindowsKernel := LoadLibrary('Kernel32.dll');
if WindowsKernel <> 0 then IsWow64Process := GetProcAddress(WindowsKernel, 'IsWow64Process'); где TIsWow64Process=function (processhandle: THandle; var isWow: BOOL): BOOL; stdcall; и проверяй свой процесс if IsWow64Process(GetCurrentProcess,iswow64) |
|||
31
Serg_1960
02.09.15
✎
15:27
|
(25) И всё.Я не в теме. И зачем мне знать битность ОС, если я сижу, допустим, в 32-битном процессе :(
|
|||
32
TormozIT
гуру
02.09.15
✎
15:30
|
> зачем мне знать битность ОС, если я сижу, допустим, в 32-битном процессе?
Затем, чтобы администрировать COM классы обоих разрядностей. |
|||
33
Serginio1
02.09.15
✎
15:42
|
(32) Кстати 23 это не ВК. Обычный Ком объект который может одновременно работать как в 32 разрядном так и 64 разрядном.
Правда для Windows 2003 Server нужно компилировать под 4.0 |
|||
34
vde69
02.09.15
✎
15:43
|
проверяй свойства PCSystemType, SystemType, ну и остальные глянь :)
Попытка Локатор = Новый COMОбъект("WbemScripting.SWbemLocator"); Исключение Отказ = Истина; Результат.Вставить("Ошибка", ОписаниеОшибки()); КонецПопытки; Если не Отказ Тогда Всего = 0; Для Каждого ТекущийАдрес из МассивАдресов Цикл Всего = Всего + 1; ПолученыеПараметры = Новый Структура; ПолученыеПараметры.Вставить("АдресIP", ТекущийАдрес); Попытка Connection = Локатор.ConnectServer(ТекущийАдрес, , Логин, Пароль); Данные = Connection.InstancesOf("Win32_NetworkAdapterConfiguration"); Для Каждого ЭлементДанных из Данные Цикл Если ТипЗнч(ЭлементДанных.IPAddress) = Тип("COMSafeArray") Тогда Для Каждого сч из ЭлементДанных.IPAddress Цикл Если сч = ТекущийАдрес Тогда ПолученыеПараметры.Вставить("MACAddress", ЭлементДанных.MACAddress); ПолученыеПараметры.Вставить("Caption", ЭлементДанных.Caption); ПолученыеПараметры.Вставить("Description", ЭлементДанных.Description); ПолученыеПараметры.Вставить("SettingID", ЭлементДанных.SettingID); КонецЕсли; КонецЦикла; КонецЕсли; КонецЦикла; Данные = Connection.InstancesOf("Win32_ComputerSystem"); Для Каждого ЭлементДанных из Данные Цикл ПолученыеПараметры.Вставить("PCSystemType", ЭлементДанных.PCSystemType); ПолученыеПараметры.Вставить("PCSystemType", ЭлементДанных.PCSystemType); ПолученыеПараметры.Вставить("Description", ЭлементДанных.Description); ПолученыеПараметры.Вставить("DNSHostName", ЭлементДанных.DNSHostName); ПолученыеПараметры.Вставить("Domain", ЭлементДанных.Domain); ПолученыеПараметры.Вставить("Model", ЭлементДанных.Model); ПолученыеПараметры.Вставить("NameComputer", ЭлементДанных.Name); ПолученыеПараметры.Вставить("PCSystemType", ЭлементДанных.PCSystemType); ПолученыеПараметры.Вставить("SystemType", ЭлементДанных.SystemType); ПолученыеПараметры.Вставить("TotalPhysicalMemory", ЭлементДанных.TotalPhysicalMemory); ПолученыеПараметры.Вставить("Workgroup", ЭлементДанных.Workgroup); КонецЦикла; Данные = Connection.InstancesOf("Win32_OperatingSystem"); Для Каждого ЭлементДанных из Данные Цикл ПолученыеПараметры.Вставить("Caption", ЭлементДанных.Caption); ПолученыеПараметры.Вставить("CSDVersion", ЭлементДанных.CSDVersion); ПолученыеПараметры.Вставить("CSName", ЭлементДанных.CSName); ПолученыеПараметры.Вставить("OSName", ЭлементДанных.Name); ПолученыеПараметры.Вставить("OSArchitecture", ЭлементДанных.OSArchitecture); ПолученыеПараметры.Вставить("ProductType", ЭлементДанных.ProductType); ПолученыеПараметры.Вставить("SerialNumber", ЭлементДанных.SerialNumber); ПолученыеПараметры.Вставить("Version", ЭлементДанных.Version); КонецЦикла; Исключение Отказ = Истина; ПолученыеПараметры.Вставить("Ошибка", ОписаниеОшибки()); КонецПопытки; ПроанализированыеIP.Добавить(ПолученыеПараметры); ДлительныеОперации.СообщитьПрогресс(Всего, ТекущийАдрес); КонецЦикла; |
|||
35
vde69
02.09.15
✎
15:44
|
кстати отсутствие свойства может означать что банально прав мало....
|
|||
36
Лефмихалыч
02.09.15
✎
16:06
|
СистемнаяИнформация (SystemInfo)
ТипПлатформы (PlatformType) Использование: Только чтение. Описание: Тип: ТипПлатформы; Неопределено. Содержит тип платформы, в рамках которой осуществляется работа. Доступность: Тонкий клиент, веб-клиент, сервер, толстый клиент, внешнее соединение, мобильное приложение(клиент), мобильное приложение(сервер). Примечание: В режиме веб-клиента, если тип платформы иной, чем описан в типе ТипПлатформы, то содержит Неопределено. |
|||
37
TormozIT
гуру
02.09.15
✎
16:43
|
(33) Такого COM класса у меня нет.
|
|||
38
TormozIT
гуру
02.09.15
✎
16:44
|
(35) Нет, т.к. права админа есть.
|
|||
39
TormozIT
гуру
02.09.15
✎
16:45
|
(36) Для (0) бесполезная инфа.
|
|||
40
vde69
02.09.15
✎
16:48
|
пробовал?
Данные = Connection.InstancesOf("Win32_ComputerSystem"); Для Каждого ЭлементДанных из Данные Цикл ("PCSystemType", ЭлементДанных.PCSystemType); ПолученыеПараметры.Вставить("SystemType", ЭлементДанных.SystemType); ПолученыеПараметры.Вставить КонецЦикла; |
|||
41
Serginio1
02.09.15
✎
16:57
|
(37) А ты работаешь только с теми COM которые установлены? Или иногда и сам устанавливаешь необходимые библиотеки.
Из .Net ты можешь вытянуть,почти все что тебе угодно. |
|||
42
TormozIT
гуру
02.09.15
✎
18:36
|
(41) Работает код в тиражной конфигурации на большом числе разных систем.
|
|||
43
oleg_km
02.09.15
✎
18:43
|
(42) Ну если ты ограничен в исходных, то что поделаешь - выкручивайся. А если я уже больше двух лет пользуюсь неограниченными возможностями .NET - то уже что-то и не знаю как без этого обойтись, а главное нафига себя ущемлять?
|
|||
44
Serginio1
03.09.15
✎
11:01
|
(43) Олег я тут добавил в файле реализацию ВК для получения Глобального контекста и его применения для создания подчиненого окна, вызова событий и методов глобального контекста
NetObjectToIDispatch - Ошибка при вызове конструктора (COMОбъект) http://files.rsdn.ru/19608/FilesForNetObjectToIDispatch.zip |
|||
45
Asmody
03.09.15
✎
11:07
|
(42) Тиражная конфигурация заточена под Windows?
|
|||
46
TormozIT
гуру
03.09.15
✎
14:16
|
(45) Да. Только у нее есть COM
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |